我有一组类,它们都应该跟踪它们是哪个实例。为此,我在父类中有一个类变量,在每个对象的初始化时复制并递增。这是一个似乎很好的最小例子:
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
放入每个子类来避免这种情况,但这让我感到多余。是否有更优雅的方式可以从父级继承行为,而不必每次都重新声明相同的变量?
答案 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