Python 将类的实例传递给类

Python 将类的实例传递给类,python,class,Python,Class,我希望能够将Foo的一个实例传递给Foo的另一个实例 我下面的代码不工作有两个原因: 在知道Foo之前,我需要在MyTypes中使用Foo。我得到了一个名称错误,Foo是未知的 在我的检查中,isinstance(values,Foo)我的Foo实例未被识别,我得到了我的TypeError“Type not supported” 有人能解释一下我该如何解决这个问题吗 谢谢 MyTypes = (list,np.ndarray, Foo) class Foo(): def __init_

我希望能够将
Foo
的一个实例传递给
Foo
的另一个实例

我下面的代码不工作有两个原因:

  • 在知道
    Foo
    之前,我需要在
    MyTypes
    中使用
    Foo
    。我得到了一个名称错误,Foo是未知的

  • 在我的检查中,
    isinstance(values,Foo)
    我的
    Foo
    实例未被识别,我得到了我的TypeError“Type not supported”

  • 有人能解释一下我该如何解决这个问题吗

    谢谢

    MyTypes = (list,np.ndarray, Foo)
    class Foo():
    
        def __init__(self,values:MyTypes) -> None:
            self.values = self._unpack_values(values)
    
        def _unpack_values(self,values):
            if not isinstance(values,MyTypes): 
                raise TypeError("Type not supported")
            else:
                if isinstance(values, list): 
                    return "list"
                elif isinstance(values, Foo):
                    return "Foo"
                elif isinstance(values, np.ndarray):
                    return "np.ndarray"
                else:
                    return ValueError("Something went wrong")
    
    f = Foo(values=Foo(values=[1,2,3]))
    

    MyTypes
    仅用作对
    \uuuu init\uuuu
    的注释,因为在创建
    Foo
    引用之前,您不能使用它,我建议您忘记注释,只需将
    MyTypes
    全部删除即可

    # MyTypes = (list,np.ndarray, Foo)
    # I would remove this
    
    class Foo:
    
        def __init__(self,values) -> None:
            self.values = self._unpack_values(values)
    
        def _unpack_values(self,values):
            # only start referencing Foo from here as a validation
            if not isinstance(values, (list, ndarray, Foo)): 
                raise TypeError("Type not supported")
            else:
                if isinstance(values, list): 
                    return "list"
                elif isinstance(values, Foo):
                    return "Foo"
                elif isinstance(values, np.ndarray):
                    return "np.ndarray"
                else:
                    return ValueError("Something went wrong")
    
    f = Foo(values=Foo(values=[1,2,3]))
    

    挑战在于,在使用方法之前,您不能在
    类Foo
    之前或在其主体内引用Foo。我看不出使用
    MyTypes有多大好处,所以这是最简单的修复方法。

    一个难看的方法就是创建一个shell类,然后从函数中添加方法:

    import numpy as np
    
    class Foo():
        pass
    
    MyTypes = (list,np.ndarray, Foo)
    
    def __init__(self,values:MyTypes) -> None:
        self.values = self._unpack_values(values)
    
    def _unpack_values(self,values):
        if not isinstance(values,MyTypes): 
            raise TypeError("Type not supported")
        else:
            if isinstance(values, list): 
                return "list"
            elif isinstance(values, Foo):
                return "Foo"
            elif isinstance(values, np.ndarray):
                return "np.ndarray"
            else:
                return ValueError("Something went wrong")
    
    Foo.__init__ = __init__
    Foo._unpack_values = _unpack_values
    
    f = Foo(values=Foo(values=[1,2,3]))
    
    

    这是否回答了您的问题?谢谢没有使用MyTypes,而是解决了这个问题。这就解释了为什么我从未遇到过这个问题,因为我刚刚开始使用注释。谢谢但是,按照链接中的建议使用来自未来导入注释的
    ,并不能解决问题。