我希望能够将Foo
的一个实例传递给Foo
的另一个实例。
我的以下代码无法正常运行有两个原因:
在知道Foo
之前,我需要在MyTypes
中使用Foo
。我收到一个NameFoo未知的错误
在我的支票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]))
答案 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]))