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
小心,但是...如果 Parent
的 counter
递增,那么所有未来的 children 都将从该值开始。
>>> Parent.counter = 3.14159
>>> class C3(Parent): pass
...
>>> C3().counter
4.14159
当前 children 将不受影响:
>>> C2().counter
4
我想要 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
小心,但是...如果 Parent
的 counter
递增,那么所有未来的 children 都将从该值开始。
>>> Parent.counter = 3.14159
>>> class C3(Parent): pass
...
>>> C3().counter
4.14159
当前 children 将不受影响:
>>> C2().counter
4