【问题标题】:Global class in pythonpython中的全局类
【发布时间】:2020-08-28 23:11:29
【问题描述】:

我希望创建一个名为Global 的运行配置类,它将存储重要的变量。这门课将传递给许多班级和他们的孩子。例如:

class Global:
    def __init__(self):
        self._var = 1

    @property
    def var(self):
        return self._var

class parent:
    def __init__(self, GLOBAL):
        self.GLOBAL = GLOBAL
        print(self.GLOBAL.var) # this works

class child(parent):
    def __init__(self):
        print(self.GLOBAL.var) # this doesn't work (because referencing the parent's instance variable)

如何使父类的所有子类都可以访问 Global 类(而不将其传递给每个子类的构造函数)?我还尝试在parent 类中创建一个类变量,并在初始化类时为其赋值。然而,这并没有奏效。

此外,如果有更好的方法来存储可变运行配置并将它们传递给许多班级及其孩子,我很乐意改变我的策略。

提前致谢!

【问题讨论】:

  • 你的__init__ Nevers 在你的子类中设置了属性,它覆盖了超类……这与你的全局类完全无关,这对任何属性
  • 为什么要使用类继承?只需在模块级别执行GLOBAL = Global(),所有其他类都可以引用它。
  • 不,它只会在设置GLOBAL = Global()的模块中。如果这与定义class parent 的模块相同,那么某些想要从父级继承的模块也将使用import parentmodule; parentmodule.GLOBAL。实际上,您可以将GLOBAL = Global() 放在父类级别。
  • 有一个问题是Global() 应该何时被实例化——如果它的__init__ 正在读取配置,那可能是一件坏事。但如果它在实际配置发生之前使用,那是一个坏事工具。这就是它只是在模块级别的优势。您的代码可以在导入所有内容之后但在类实例化它之前对其进行初始化。
  • self._var = 1 建议这些类的不同实例可以获得不同的配置。 Global 算单身吗?

标签: python class inheritance


【解决方案1】:

1) 你的 child 类应该像这样调用 parent __init__ 方法:

super().__init__(...)

否则你根本不会设置 GLOBAL 字段。我想你可以阅读更多here

2) 你想创建一个全局对象,不是吗?我的意思是,不是一个类,而是该类的对象,因为您在构造函数中访问变量 var。无论如何,您可以在模块范围内创建一个变量并使用它。

Global:
    ...

OtherClass:
    def run(self):
        print(_global_settings)

_global_settings = Global()  # or something similar

3) 如果可能,您最好遵循PEP8 样式,这样您的代码将更易于阅读和理解。特别是,将您的类名大写并为类字段使用小写。

【讨论】:

  • 嗨@stardust 感谢您的回复。需要跨模块引用全局对象,但这会很好。并注明风格。
【解决方案2】:

如果你的child类没有覆盖构造函数__init__,那么在构造child对象时会使用parent.__init__,你会得到你想要的功能。但是,如果您需要为派生类编写专门的构造函数,则需要将Global 对象传递给child.__init__parent.__init__ 构造函数的显式调用。

Python 没有自动构造函数链接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多