【问题标题】:How to make tuple subclass accept 2 arguments? [duplicate]如何使元组子类接受 2 个参数? [复制]
【发布时间】:2019-07-11 02:06:36
【问题描述】:

我创建了一个元组子类来为元组添加一个属性。使用与列表子类相同的逻辑,可以正常工作。 代码:

class TupleObject(tuple):
    def __init__(self, property, _tuple):
        super().__init__(_tuple)
        self.property = property

_tuple = TupleObject(property, (0, 0))

抛出错误:

TypeError:元组最多需要 1 个参数,得到 2 个

我怎样才能做到这一点?对列表子类使用这种精确的方法可以按预期工作。

【问题讨论】:

    标签: python python-3.x oop tuples


    【解决方案1】:

    由于元组是不可变的,您需要覆盖__new__ 才能在创建实例之前修改对象。

    class TupleObject(tuple):
    
        def __new__(cls, property, _tuple):
            self = super().__new__(cls, _tuple)
            self.property = property
            return self
    
    _tuple = TupleObject('a prop', (0, 0))
    _tuple, _tuple.property
    

    生产

    ((0, 0), 'a prop')
    

    【讨论】:

    • 此代码已损坏;它将使property 成为TupleObjectclass 属性,而不是实例属性,因为第一个参数是类本身,而不是要初始化的实例。您需要将第一个参数接收为cls(以避免混淆人们),然后执行:self = super().__new__(cls, _tuple)self.property = propertyreturn self
    • @ShadowRanger 谢谢你,非常好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 2020-02-23
    • 1970-01-01
    相关资源
    最近更新 更多