为了账号安全,请及时绑定邮箱和手机立即绑定

使用多个__init__参数将元组子类化

使用多个__init__参数将元组子类化

蛊毒传说 2019-10-11 14:26:45
以下代码有效: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)为什么?
查看完整描述

2 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

因为元组是不可变的,所以您必须改写__new__:


python文档


object.__new__(cls[, ...])


调用以创建class的新实例cls。__new__()是一个静态方法(特殊情况,因此您无需这样声明),它将实例被请求的类作为其第一个参数。其余参数是传递给对象构造函数表达式(对类的调用)的参数。的返回值__new__()应该是新的对象实例(通常是的实例cls)。


典型的实现通过__new__()使用super(currentclass, cls).__new__(cls[, ...])带有适当参数的超类的方法来 创建该类的新实例,然后在返回之前根据需要修改新创建的实例。


如果__new__()返回的实例  cls,则将__init__()调用新实例的 方法__init__(self[, ...]),其中self是新实例,其余参数与传递给的参数相同__new__()。


如果__new__()未返回的实例cls,则__init__()不会调用新实例的方法。


__new__()主要是用来允许不可改变的类型(如类的子类  int,str或tuple)来定制实例创建。为了自定义类的创建,它通常也被自定义元类覆盖。


查看完整回答
反对 回复 2019-10-11
?
慕沐林林

TA贡献2016条经验 获得超9个赞

要分配元组值,您需要重写__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.b


查看完整回答
反对 回复 2019-10-11
  • 2 回答
  • 0 关注
  • 417 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信