Python:向基类的列表/元组成员追加内容

5 投票
2 回答
1528 浏览
提问于 2025-04-18 10:13

我刚才被问到这个问题,想了半天也没想到一个很好的Python解决方案,所以我想把这个问题放在这里,看看大家有什么更好的想法。

在一个父类中,扩展一个基类的变量,比如元组、列表等等,最好的方法是什么呢?

下面这个方法是可行的……

class BaseClass(object):
    some_class_member = (1, 2, 3, 4, 5,)


class AnotherClass(BaseClass):
    some_class_member = BaseClass.some_class_member + (6, 7,)

a = BaseClass()
a.some_class_member  # (1, 2, 3, 4, 5)

b = AnotherClass()
b.some_class_member  # (1, 2, 3, 4, 5, 6, 7)

但是这样做似乎不太符合Python的风格,因为你需要通过基类的名字来引用它,如果基类的名字改了,你就得更新代码。有没有更好的方法呢?

2 个回答

3

我能理解你的观点,不过你已经通过将BaseClass指定为新子类的父类,直接引用了它的名字。

为了应对“如果名字改变了”这种情况,你可以再增加一层继承:

class MyBaseClass(BaseClass):
    """ This is here so that all of my classes just inherits from this one """


class AnotherClass(MyBaseClass):
    super_special_member = MyBaseClass.super_special_member + (6, 7, )


class ClassThatDoesntNeedSuperSpecialMember(MyBaseClass):
    """ Cool. """

MyBaseClass就像一个“常量”变量,你可以改变它继承的内容,其他所有地方都会自动更新。

2

BaseClassBaseClass.some_class_member 中并不代表 AnotherClass 的父类。它只是

BaseClass.some_class_member。你可以在不创建对象的情况下直接访问它。

 >>> BaseClass.some_class_member
 (1, 2, 3, 4, 5)

如果你的目的是在不创建对象的情况下访问这个值,简单的答案是 no。不过,如果是在创建对象之后访问这个值呢?

那怎么样呢?

class AnotherClass(BaseClass):
    def __init__(self):
        self.some_class_member += (6, 7,)

撰写回答