将类的实例传递给类

时间:2020-04-24 18:08:30

标签: python class

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

我的以下代码无法正常运行有两个原因:

  1. 在知道Foo之前,我需要在MyTypes中使用Foo。我收到一个NameFoo未知的错误

  2. 在我的支票isinstance(values,Foo)中,我的Foo实例未被识别,并且出现TypeError“类型不受支持”。

有人可以解释一下我该如何解决吗?

谢谢!

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]))

2 个答案:

答案 0 :(得分:1)

MyTypes仅用作__init__的注释,因为在创建之前无法拥有Foo引用,所以建议您不要使用注释,而只需删除{ {1}}。

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。我认为拥有class Foo并不会带来太多好处,所以这将是最简单的解决方法。

答案 1 :(得分:0)

可以走的一条丑陋路线就是创建一个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]))

python tutor link to code