1

我正在尝试在 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__()

有什么方法可以做到这一点,还是我以错误的方式看待问题?

4

2 回答 2

7

问题是 aclassmethod没有接收实例 ( self) 作为参数。相反,它接收对调用它的类对象的引用。通常这个参数被命名cls,尽管这个约定比 for 的约定弱一些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
于 2012-11-21T05:37:12.470 回答
1

由于您将其设为类方法,因此它的self参数不是实例而是类本身。所以你想做self()。出于这个原因,习惯上将类方法的第一个参数命名为 not selfbut cls

于 2012-11-21T05:37:23.387 回答