【问题标题】:Access a Class object from a class static variable in python3?从python3中的类静态变量访问类对象?
【发布时间】:2020-01-12 08:24:18
【问题描述】:

是否可以从python3中的类静态变量访问类对象或其内部类对象?

class OuterClass:
    all_subclasses = {
        # is it possible to access the OuterClass from a class static variable
        'innerclass1': OuterClass.InnerClass1
    }
    @classmethod
    isInnerClass(cls, identifier: str):
        return identifier.lower() in cls.all_subclasses

    class InnerClass1:
        def __init__(self):
             pass

如果没有,有什么替代方法?

【问题讨论】:

  • 如果你在all_subclasses之前定义了InnerClass1,你可以直接用InnerClass1引用它。你不能在它自己的定义中引用OuterClass,因为它还不存在。
  • @PatrickHaugh:你是对的。 Python是解释语言,我对编译语言感到困惑。如果你想把它作为答案,我可以接受它是正确的。

标签: python-3.x inner-classes class-variables


【解决方案1】:

可以在类定义中直接引用类的属性,只要引用在定义之后即可:

class A:
    class B:
        pass
    x = B

print(A.x)
# <class '__main__.A.B'>

这有一些警告。 For reasons that are very complicated, 你不能在类定义的理解中直接使用类属性:

class A:
    class B:
        pass
    x = [B for _ in range(5)]  # NameError: name 'B' is not defined

你也不能在自己的定义中引用类本身:

class A:
    x = A  # NameError: name 'A' is not defined

这是因为类定义基本上是另一种创建type 对象的方式

class A:
    x = 1

A = type('A', (object,), {'x': 1})

你不能在创建对象之前使用它,而且你不能用尚未分配的名称来引用它,这都是完全有意义的。

请务必注意,这一切仅适用于类定义本身,即在创建类时直接执行的所有代码。稍后执行的代码,如方法定义,可以像任何其他代码一样引用该类,也可以通过type(self)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    相关资源
    最近更新 更多