下面的代码可以工作:
class Foo(tuple):
def __init__(self, b):
super(Foo, self).__init__(tuple(b))
if __name__ == '__main__':
print Foo([3, 4])
$ python play.py 结果:
play.py:4: DeprecationWarning: object.__init__() takes no parameters
super(Foo, self).__init__(tuple(b))
(3, 4)但不包括以下内容:
class Foo(tuple):
def __init__(self, a, b):
super(Foo, self).__init__(tuple(b))
if __name__ == '__main__':
print Foo(None, [3, 4])
$ python play.py 结果:
Traceback (most recent call last):
File "play.py", line 7, in <module>
print Foo(None, [3, 4])
TypeError: tuple() takes at most 1 argument (2 given)为什么?
发布于 2009-10-14 10:24:33
因为元组是不可变的,所以您必须覆盖__new__:
python docs
object.__new__(cls[, ...])
调用以创建类cls的新实例。__new__()是一个静态方法(特殊大小写,所以您不需要这样声明它),它将请求实例的类作为它的第一个参数。其余的参数是那些传递给对象构造函数表达式(对类的调用)的参数。__new__()的返回值应该是新的对象实例(通常是cls的实例)。
典型的实现通过使用带有适当参数的super(currentclass, cls).__new__(cls[, ...])调用超类的__new__()方法来创建类的新实例,然后根据需要修改新创建的实例,然后返回它。
如果__new__()返回cls的一个实例,那么新实例的__init__()方法将像__init__(self[, ...])一样被调用,其中self是新实例,其余参数与传递给__new__()的参数相同。
如果__new__()不返回cls的实例,则不会调用新实例的__init__()方法。
__new__()主要用于允许不可变类型(如int、str或tuple)的子类自定义实例创建。它通常在自定义元类中被覆盖,以便自定义类的创建。
发布于 2012-10-27 05:38:34
要分配元组值,您需要覆盖__new__方法:
class Foo(tuple):
def __new__ (cls, a, b):
return super(Foo, cls).__new__(cls, tuple(b))这些参数似乎被元组类的__init__实现忽略了,但是如果你需要做一些初始化工作,你可以这样做:
class Foo(tuple):
def __new__ (cls, a, b):
return super(Foo, cls).__new__(cls, tuple(b))
def __init__(self, a, b):
self.a=a
self.b=b
if __name__ == '__main__':
foo = Foo(None, [3, 4])
print foo
print foo.a
print foo.bhttps://stackoverflow.com/questions/1565374
复制相似问题