我想拥有基于类的计数器,存储创建的实例数。
可以这样实现:
class Parent(object):
counter = 0
def __init__(self):
# remembers the order in which the instances were created
self.counter = counter
Parent.counter += 1
我希望有许多Child
个类做同样的事情,即每个Child
类应该有一个单独的counter
。
由于逻辑是相同的,我觉得我应该能够从父的__init__
方法增加子类的计数器,而不是复制粘贴它。
答案 0 :(得分:2)
一种选择是使用类方法来更新counter
:
class Parent(object):
counter = 0
def __init__(self):
self.counter = self.counter # get the current value of the class attribute
self.increment_counter()
@classmethod
def increment_counter(cls):
cls.counter += 1
class Child1(Parent):
pass
class Child2(Parent):
pass
使用中:
>>> c1a = Child1()
>>> c1b = Child1()
>>> c2a = Child2()
>>> Parent.counter
0 # no Parent instances
>>> Child1.counter
2 # two Child1 instances
>>> Child2.counter
1 # one Child2 instance
>>> c2a.counter
0
>>> c1b.counter
1
>>> c2a.counter
0
但请注意,对每个类(counter
)的实例数重复使用名称ClassName.counter
以及每个实例的编号(instance.counter
)会使其更难访问前者来自实例方法。
答案 1 :(得分:2)
是的,您应该能够从父母那里增加孩子的计数器 - 但是您已经对该课程进行了硬编码。
def __init__(self):
type(self).counter += 1
应该做的伎俩...
>>> class Parent(object):
... counter = 0
... def __init__(self):
... type(self).counter += 1
...
>>> class C1(Parent): pass
...
>>> class C2(Parent): pass
...
>>> C1().counter
1
>>> C1().counter
2
>>> C1().counter
3
>>> C2().counter
1
>>> C2().counter
2
>>> C2().counter
3
要小心,但是......如果Parent
的{{1}}增加,那么所有未来的孩子都将从该值开始。
counter
目前的孩子不会受到影响:
>>> Parent.counter = 3.14159
>>> class C3(Parent): pass
...
>>> C3().counter
4.14159