Python3 继承 class 变量而不继承值

Python3 inherit class variable without inheriting value

我有一组 classes,它们都应该跟踪它们是哪个实例。为此,我在父 class 中有一个 class 变量,它在每个对象的初始化时被复制和递增。这是一个看起来工作正常的最小示例:

class Parent:
    counter = 0
    def __init__(self):
        self.name = self.__class__.__name__ + "_" + str(self.__class__.counter)
        self.__class__.counter += 1

    def __repr__(self):
        return self.name

mother = Parent()
father = Parent()
print(mother)
print(father)

Parent_0

Parent_1

到目前为止一切顺利。现在我想使用 make 一些具有相同行为的 subclasses 而无需重写代码。所以我这样做:

class Child(Parent):
    # counter = 0
    pass

son = Child()
daughter = Child()
stepfather = Parent()

print(son)
print(daughter)
print(stepfather)

Child_2

Child_3

Parent_2

这种行为不是我想要的。当创建子实例的第一个实例时,它会继承父计数器当时具有的任何值,但是在此之后 classes 每个都维护自己的计数器。我可以通过将行 counter = 0 放入每个子 class 来避免这种情况,但这让我觉得是多余的。有没有更优雅的方法可以让我从父级继承行为而不必每次都重新声明相同的变量?

不知道您为什么想要这种行为,但是...不是计数器 int,而是在 Parent 中创建一个计数器 dict:str->int。使用 self.__class__.__name__ 的键访问其中每个单独的 class 的 运行 计数器。用 dict.setdefault(self.__class__.__name__,0) 赋值并在 __init__.

内递增
 class Parent:
    counter = dict()

    def __init__(self):
        Parent.counter.setdefault(self.__class__.__name__,0)
        self.name = f'{self.__class__.__name__}_{Parent.counter[self.__class__.__name__]}' 
        Parent.counter[self.__class__.__name__] += 1

    def __repr__(self):
        return self.name

mother = Parent()
father = Parent()
print(mother)
print(father)

class Child(Parent):
    # counter = 0
    pass

son = Child()
daughter = Child()
stepfather = Parent()

print(son)
print(daughter)
print(stepfather)

输出:

Parent_0
Parent_1
Child_0
Child_1
Parent_2