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