Parent 正在更改 child 的属性

Parent changing child's attribute

我想要 class-based 计数器,存储创建的实例数。

可以这样实现:

class Parent(object):
    counter = 0
    def __init__(self):
        # remembers the order in which the instances were created
        self.counter = counter
        Parent.counter += 1

而且我希望有许多 Child class 做同样的事情,即每个 Child class 应该有一个单独的 counter.

由于逻辑相同,我觉得我应该可以从 parent 的 __init__ 方法中增加 child class 的计数器,而不是 copy-pasting 它。

一个选择是使用 class 方法 来更新 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

但是请注意,为每个 class 上的实例数(ClassName.counter)和每个实例的编号(instance.counter 重复使用名称 counter ) 使得从实例方法访问前者变得更加困难。

是的,您应该能够从 parent 增加 child 的计数器——但是您已经 hard-coded class。

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

小心,但是...如果 Parentcounter 递增,那么所有未来的 children 都将从该值开始。

>>> Parent.counter = 3.14159
>>> class C3(Parent): pass
... 
>>> C3().counter
4.14159

当前 children 将不受影响:

>>> C2().counter
4