父改变孩子的属性

时间:2015-01-27 14:35:21

标签: python inheritance python-3.x attributes parent-child

我想拥有基于类的计数器,存储创建的实例数。

可以这样实现:

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__方法增加子类的计数器,而不是复制粘贴它。

2 个答案:

答案 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