Python3继承了类变量而没有继承值

时间:2018-03-05 12:38:55

标签: python-3.x inheritance class-variables

我有一组类,它们都应该跟踪它们是哪个实例。为此,我在父类中有一个类变量,在每个对象的初始化时复制并递增。这是一个似乎很好的最小例子:

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一些具有相同行为的子类而不重写代码。所以我这样做:

class Child(Parent):
    # counter = 0
    pass

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

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

Child_2

     

Child_3

     

Parent_2

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

1 个答案:

答案 0 :(得分:1)

不知道为什么你想要这种行为,但是......而不是计数器int,在dict:str->int中创建一个计数器Parent。使用self.__class__.__name__的键访问其中每个单独类的运行计数器。将其分配为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