【问题标题】:Python: sharing "static" variables through inharitence [duplicate]Python:通过inharitence共享“静态”变量[重复]
【发布时间】:2025-12-11 06:15:01
【问题描述】:

我对目标python有一个特殊的问题,我想要一个配置类(Config),所以它可以用作其他需要配置数据的类的基类。我想要做的是使用这个 Config 类在所有继承类之间共享一次启动的数据。对我来说重要的是,当类继承配置数据时,我希望它能够像它所拥有的那样使用它,例如:

class Config:
    a= None
    b= None

class A(Config):
    def __init__(self):
        a = 10

    def print_a(self):
        print(self.a)

这是第一个问题,我应该如何在 A 类中设置 a 和 b 的值?另一个是如何在类内部调用它们?

当我这样做时:

obj = A()
obj.a = 5

或者当我添加methon做一个类,它设置了一个变量:

    class A(Config):
    def __init__(self):
        a = 10

    def print_a(self):
        print(self.a)

    def setA(self, val):
        a = val

然后打电话:

obj = A()
obj.setA(12)

它不会改变 A.a 或 Config.a

总而言之,我的目标是创建一个带有静态变量(Config)的类,通过继承,我想从另一个类 A(Config)获得对这些变量的访问权,并使用这些变量,因为它们是本机类变量。同样重要的是 obj = A() -> obj.a 中的每次更改都应该更改 Config.a 变量(当我更改变量 a 插入类 A)。

我想做什么是一个令人困惑的想法,希望你能理解。另外我对python还很陌生,所以还有很多我不明白的地方,请尽量原谅:)。

【问题讨论】:

  • 虽然您可以通过其所有实例读取类属性,但您只能通过实例写入实例属性。
  • a = 5 分配一个局部变量。 self.a = 5 分配一个实例属性Config.a = 5 分配一个类属性。 type(self).a = 5 将属性分配给 current 类,这在您进行继承时可能会很有趣。
  • @deceze 谢谢你,很抱歉在下面提到你愚蠢的我,但我没有注意到你上面的回复。问题是我对范围的误解,现在我明白了:)

标签: python class inheritance static


【解决方案1】:

忽略这个,我误解了这个问题,欢迎评论

据我所知,问题是缺少self 的使用。在方法A.setA()A.__init__ 中,您必须使用self.a,因此只需为该方法创建一个局部变量。

因此,A 类的功能版本如下所示:

class A(Config):
    def __init__(self):
        self.a = 10    #As I mentioned, you need this `self.a` rather than just `a`

    def print_a(self):
        print(self.a)    #You got that right

    def setA(self, val):
        self.a = val    #Same here with `self.a`

将方法视为简单地定义 function 类的变量,并且除了用于访问属性的附加 self 参数外,该方法的行为与在类之外的行为相同类的。

【讨论】:

  • 但不就是在A类中创建一个局部变量a吗?我想从 Config 类访问“静态”变量 a,这就是为什么我只使用 a=10 - 但这只是我的直觉。因为我们可以做 obj.a = 10。而且我希望它的行为方式是,如果 A 类中的变量 a 发生更改,它也会在 Config 类中更改并共享给从 Config 类继承的其他类。
  • 当你基于另一个类创建一个类时,基类与继承它的类合并,并且继承类,在这种情况下为A,从基类中获取所有属性,在这个案例Config。所以即使你没有在A.__init__中设置变量a,其他方法(在A类中)仍然可以从Config访问变量a作为self.a
  • 问题是,当我在 A 类 init 方法中分配变量 a 时,就像您建议的那样:self.a = 10,Config 中的变量 a 不等于 10 它保持不变无,因此它不是由 Config 之后继承的所有类共享。现在我正在阅读关于使用 cls 词而不是 self 的信息,也许可以吗?
  • 看来我误解了你的问题,如果我现在理解正确的话,你必须使用@deceze♦的建议并设置Config.a
  • @dante 除非您在与我相同的线程中发表评论,否则我不会看到对我的回复。是的,如果您设置A.a,则不会影响Config.a。所以改为设置Config.a!?