我希望能够通过使用类中的方法返回类的多个对象。这样的事情。
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)
我绝对不清楚调用以及'self'关键字的使用情况。你能帮我解决这个问题吗?
谢谢。
答案 0 :(得分:2)
TypeError:必须使用A实例调用未绑定方法_multiple() 作为第一个参数(改为使用int实例)
错误是自我解释的。这意味着实例方法被称为Class方法。要将实例方法作为类方法,请添加装饰器@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>]
>>>
答案 1 :(得分: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
个对象的列表。
答案 2 :(得分:0)
简单地替换:
self.__init__(self, i)
使用:
A(i)
原因是init方法改变了调用它的对象,“self”是当前实例。您可以使用构造函数(与类同名)来创建新实例。