Python 静态变量
Python static variables
我正在尝试将单个静态变量作为此 parent class 的所有 child 实例的 'id'。我遇到的问题是重复计算此 ID,可能是因为 parent 的 __init__
被调用了两次。但是,如果我删除显式 Parent().__init__()
调用,则计数器根本不会增加。如何让 id 只增加一个?这是我的代码片段:
#!/usr/bin/python3
class Parent:
cls_id = 0
def __init__ (cls):
cls.cls_inc_id()
@classmethod
def cls_inc_id (cls):
cls.cls_id += 1
@classmethod
def child_inc_id (self):
self.id += 1
class Child1 (Parent):
def __init__ (self):
Parent().__init__()
self.id = super().cls_id
print ("Child1 id: ", self.id)
class Child2 (Parent):
def __init__ (self):
Parent().__init__()
self.id = super().cls_id
print ("Child2 id: ", self.id)
child1 = Child1()
child2 = Child1()
child3 = Child2()
child4 = Child2()
我的输出是:
%> ./static_vars.py
Child1 id: 2
Child1 id: 4
Child2 id: 6
Child2 id: 8
提前致谢
由于Parent().__init()
,它增加了两次。这会创建一个全新的对象,对其进行初始化,然后将其丢弃。您应该在 __init__ method refer to
Parent.cls_inc_id` 中使用 super().__init__()
。然后就可以了
顺便说一下,在 Parent.__init__
中,您将参数称为“cls”,但它实际上是“self”——这是一个对象方法,而不是 class 方法。
新代码:
#!/usr/bin/python3
class Parent:
cls_id = 0
def __init__ (self):
print("Parent.__init__")
Parent.cls_inc_id()
@classmethod
def cls_inc_id (cls):
print("Parent.cls_inc_id")
cls.cls_id += 1
@classmethod
def child_inc_id (cls):
print("child_inc_id")
cls.id += 1
class Child1 (Parent):
def __init__ (self):
print("Child1.__init__")
super().__init__()
self.id = super().cls_id
print ("Child1 id: ", self.id)
class Child2 (Parent):
def __init__ (self):
print("Child2.__init__")
super().__init__()
self.id = super().cls_id
print ("Child2 id: ", self.id)
child1 = Child1()
child2 = Child1()
child3 = Child2()
child4 = Child2()
输出:
Child1.__init__
Parent.__init__
Parent.cls_inc_id
1
Child1 id: 1
Child1.__init__
Parent.__init__
Parent.cls_inc_id
1
Child1 id: 2
Child2.__init__
Parent.__init__
Parent.cls_inc_id
1
Child2 id: 3
Child2.__init__
Parent.__init__
Parent.cls_inc_id
1
Child2 id: 4
正如其他人所提到的,您没有正确使用 super
构造函数,但我也会引用父 class 中的实际 class,而不是实例 [=15] =] 你错误地命名为 cls
:
class Parent:
cls_id = 0
def __init__(self):
self.id = Parent.cls_id
Parent.cls_id += 1
class Child1(Parent):
def __init__(self):
super().__init__()
print ("Child1 id: ", self.id)
class Child2(Parent):
def __init__(self):
super().__init__()
print ("Child2 id: ", self.id)
child1 = Child1()
child2 = Child1()
child3 = Child2()
child4 = Child2()
Child1 id: 0
Child1 id: 1
Child2 id: 2
Child2 id: 3
如果您希望每个类型的 class 都有一个单独的 ID,您可以使用字典映射 class 到 id:
from collections import defaultdict
class Parent:
cls_ids = defaultdict(int)
def __init__(self):
self.id = Parent.cls_ids[type(self)]
Parent.cls_ids[type(self)] += 1
Child1 id: 0
Child1 id: 1
Child2 id: 0
Child2 id: 1
我正在尝试将单个静态变量作为此 parent class 的所有 child 实例的 'id'。我遇到的问题是重复计算此 ID,可能是因为 parent 的 __init__
被调用了两次。但是,如果我删除显式 Parent().__init__()
调用,则计数器根本不会增加。如何让 id 只增加一个?这是我的代码片段:
#!/usr/bin/python3
class Parent:
cls_id = 0
def __init__ (cls):
cls.cls_inc_id()
@classmethod
def cls_inc_id (cls):
cls.cls_id += 1
@classmethod
def child_inc_id (self):
self.id += 1
class Child1 (Parent):
def __init__ (self):
Parent().__init__()
self.id = super().cls_id
print ("Child1 id: ", self.id)
class Child2 (Parent):
def __init__ (self):
Parent().__init__()
self.id = super().cls_id
print ("Child2 id: ", self.id)
child1 = Child1()
child2 = Child1()
child3 = Child2()
child4 = Child2()
我的输出是: %> ./static_vars.py
Child1 id: 2
Child1 id: 4
Child2 id: 6
Child2 id: 8
提前致谢
由于Parent().__init()
,它增加了两次。这会创建一个全新的对象,对其进行初始化,然后将其丢弃。您应该在 __init__ method refer to
Parent.cls_inc_id` 中使用 super().__init__()
。然后就可以了
顺便说一下,在 Parent.__init__
中,您将参数称为“cls”,但它实际上是“self”——这是一个对象方法,而不是 class 方法。
新代码:
#!/usr/bin/python3
class Parent:
cls_id = 0
def __init__ (self):
print("Parent.__init__")
Parent.cls_inc_id()
@classmethod
def cls_inc_id (cls):
print("Parent.cls_inc_id")
cls.cls_id += 1
@classmethod
def child_inc_id (cls):
print("child_inc_id")
cls.id += 1
class Child1 (Parent):
def __init__ (self):
print("Child1.__init__")
super().__init__()
self.id = super().cls_id
print ("Child1 id: ", self.id)
class Child2 (Parent):
def __init__ (self):
print("Child2.__init__")
super().__init__()
self.id = super().cls_id
print ("Child2 id: ", self.id)
child1 = Child1()
child2 = Child1()
child3 = Child2()
child4 = Child2()
输出:
Child1.__init__
Parent.__init__
Parent.cls_inc_id
1
Child1 id: 1
Child1.__init__
Parent.__init__
Parent.cls_inc_id
1
Child1 id: 2
Child2.__init__
Parent.__init__
Parent.cls_inc_id
1
Child2 id: 3
Child2.__init__
Parent.__init__
Parent.cls_inc_id
1
Child2 id: 4
正如其他人所提到的,您没有正确使用 super
构造函数,但我也会引用父 class 中的实际 class,而不是实例 [=15] =] 你错误地命名为 cls
:
class Parent:
cls_id = 0
def __init__(self):
self.id = Parent.cls_id
Parent.cls_id += 1
class Child1(Parent):
def __init__(self):
super().__init__()
print ("Child1 id: ", self.id)
class Child2(Parent):
def __init__(self):
super().__init__()
print ("Child2 id: ", self.id)
child1 = Child1()
child2 = Child1()
child3 = Child2()
child4 = Child2()
Child1 id: 0
Child1 id: 1
Child2 id: 2
Child2 id: 3
如果您希望每个类型的 class 都有一个单独的 ID,您可以使用字典映射 class 到 id:
from collections import defaultdict
class Parent:
cls_ids = defaultdict(int)
def __init__(self):
self.id = Parent.cls_ids[type(self)]
Parent.cls_ids[type(self)] += 1
Child1 id: 0
Child1 id: 1
Child2 id: 0
Child2 id: 1