循环并创建对象数组

时间:2012-11-21 05:31:33

标签: python oop google-app-engine python-2.7

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

的行

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

2 个答案:

答案 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