我正在尝试在Python中创建一个对象列表。下面的代码应该(希望)解释我在做什么:
class Base(object):
@classmethod
def CallMe(self):
out = []
#another (models) object is initialised here which is iterable
for model in models:
#create new instance of the called class and fill class property
newobj = self.__class__()
newobj.model = model
out.append(newobj)
return out
class Derived(Base):
pass
我正在尝试按如下方式初始化该类:
objs = Derived.CallMe()
我希望'objs'包含我可以迭代的对象列表。
我在堆栈跟踪中遇到以下错误:TypeError: type() takes 1 or 3 arguments
包含newobj = self.__class__()
有没有办法做到这一点,还是我以错误的方式看待问题?
答案 0 :(得分:7)
问题是classmethod
没有收到实例(self
)作为参数。相反,它接收对它被调用的类对象的引用。这个参数通常被命名为cls
,虽然这个约定不如self
那么强(你偶尔会看到带有名字的代码,比如klass
)。
因此,只需致电self.__class__()
,而不是致电cls()
来创建您的实例。如果函数被调用为Derived
,则会获得Derived.CallMe()
个实例,如果调用Base
,则会获得Base.CallMe()
个实例。
@classmethod
def CallMe(cls): # signature changed
out = []
models = something()
for model in models:
newobj = cls() # create instances of cls
newobj.model = model
out.append(newobj)
return out
答案 1 :(得分:1)
由于你使它成为一个类方法,它的self
参数不是一个实例,而是一个类本身。所以你想做self()
。出于这个原因,习惯上将类方法的第一个参数命名为self
而不是cls
。