2

我希望能够通过使用类中的方法返回一个类的多个对象。像这样的东西。

class A:
    def __init__(self,a):
    self.a = a

    def _multiple(self,*l):
        obj = []
        for i in l:
            o = self.__init__(self,i)
            obj.append(o)
        return obj

当我在 iPython(iPython 0.10 和 Python 2.6.6)上执行此操作时,我得到以下信息

In [466]: l = [1,2]
In [502]: A._multiple(*l)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

TypeError: unbound method _multiple() must be called with A instance as 
first argument (got int instance instead)

我绝对不清楚调用以及“自我”关键字的使用。你能帮我纠正一下吗?

谢谢你。

4

3 回答 3

3

类型错误:必须使用 A 实例作为第一个参数调用未绑定的方法 _multiple()(改为获取 int 实例)

错误是不言自明的。这意味着实例方法被称为类方法。要将实例方法作为类方法添加装饰器@classmethod

>>> class A:
    def __init__(self,a):
        self.a = a
    @classmethod
    def _multiple(cls,*l):
        #Create multiple instances of object `A`
        return [A(i) for i in l]

>>> l = [1,2]
>>> A._multiple(*l)
[<__main__.A instance at 0x066FBB20>, <__main__.A instance at 0x03D94580>]
>>> 
于 2013-01-30T09:37:28.560 回答
1

你想要一个类方法:

class A:
    def __init__(self,a):
        self.a = a

    @classmethod
    def _multiple(cls,*l):
        obj = []
        for i in l:
            o = cls(i)
            obj.append(o)
        return obj


>>> A._multiple(1, 2) # returns 2 A's
[<__main__.A instance at 0x02B7EFA8>, <__main__.A instance at 0x02B7EFD0>]

classmethod装饰器将通常的第一个参数替换为self对类的引用(在本例中A)。请注意,这样做意味着如果您子类化A并调用_multiple子类,它将被传递给子类。

class B(A): pass

>>> B._multiple(1, 2, 3)
[<__main__.B instance at 0x02B87C10>, <__main__.B instance at 0x02B87D28>, <__main__.B instance at 0x02B87CD8>]

将创建一个B对象列表。

于 2013-01-30T09:36:56.183 回答
0

只需更换:

 self.__init__(self, i)

和:

 A(i)

这样做的原因是 init 方法改变了调用它的对象,而“self”是当前实例。您使用构造函数(与类同名)来创建一个新实例。

于 2013-01-30T09:36:30.357 回答