【问题标题】:Python - reference inner class from other inner classPython - 从其他内部类引用内部类
【发布时间】:2017-06-30 08:11:55
【问题描述】:

我正在尝试从另一个内部类引用一个内部类。我都试过了:

class Foo(object):

  class A(object):
    pass

  class B(object):
    other = A

class Foo(object):

  class A(object):
    pass

  class B(object):
    other = Foo.A

各自的结果:

Traceback (most recent call last):
  File "python", line 1, in <module>
  File "python", line 6, in Foo
  File "python", line 7, in B
NameError: name 'A' is not defined

Traceback (most recent call last):
  File "python", line 1, in <module>
  File "python", line 6, in Foo
  File "python", line 7, in B
NameError: name 'Foo' is not defined

这可能吗?

【问题讨论】:

  • 从您的尝试中可以清楚地看出答案是否定的,但是您最终要在这里做什么? 你想解决什么问题?
  • 为什么有嵌套类?它们在 Python 中很少有用。
  • 使用类并不总是适合您要解决的问题。
  • 第 1 部分)我知道这将不可避免地导致“你没有使用 Python 设计”。我知道这一点,但这种论点在很大程度上是主观的。我的应用程序有几个不同的模型,例如User 和 Transaction,分别位于 models/user.py 和 models/transaction.py 中。两个模型类都有 protopc 消息类,“Msg”,例如User.Msg 和 Transaction.Msg。为了导入简洁和维护两个消息类之间的命名空间,我将它们设为内部类。
  • 第 2 部分)因此,我可以执行“从用户导入用户”并使用“用户”和“用户”而不是“导入用户”并使用“user.User”和“user.Msg” .味精”。 “交易”的例子更长。问题是我还有一个“Transaction.Msg”需要引用的“Transaction.Status”。

标签: python python-2.7 oop inner-classes


【解决方案1】:

这是不可能的,因为您在类中定义的所有内容仅在该类的实例中成为有效成员,除非您使用@staticmethod 定义方法,但类没有这样的属性。

所以,这也行不通:

class Foo(object):
    x = 10

    class A(object):
        pass

    class B(object):
        other = x

工作,但不是你想要的:

class Foo(object):
  x = 10

  class A(object):
    pass

  class B(object):
    def __init__(self):
        self.other = Foo.A

f = Foo()
print(f.B().other)

输出是:

<class '__main__.Foo.A'>

这样做的原因是方法(在本例中为 __init__)是在创建对象时评估的,而在读取和解释类时评估 __init__ 之前的赋值。

您可以通过在自己的模块中定义所有类来获得您想要的相同的东西。导入模块,使其成为一个对象,其字段是您在其中定义的类。

【讨论】:

  • 感谢您将我从“为什么要在 Python 中这样做?”中解救出来。争论并帮助我理解。
  • 是的,很遗憾,您的解决方案不适用于我的“B 级”。 B 类具有处理 B 类变量的元类逻辑。是的,我可以重新组织这些类(无论如何它们都在同一个模块中)。不过,我试图利用内部类的内在命名空间。
  • 您可能应该澄清以下陈述:“因为您在类中定义的所有内容仅在该类的实例中才成为有效成员”。 Foo.x、Foo.A、Foo.B 附加到类对象,而不是实例。您可以请求这些类限定成员中的每一个的 id() 并查看它们是否存在,并且它们对于实例限定成员访问是相同的。
【解决方案2】:

我认为这不是一个好的面向对象实践,但您可以在外部类范围内设置内部类属性。例如。

class Class2:

    class Labels:
        c2l1 = 'label 1'
        c2l2 = 'label 2' 

    class Params:
        pass 
        # p1 = None
        # p2 = None
        # p3 = None

    Params.p1 = Labels.c2l2
    Params.p2 = 1234


print(Class2.Params.p1)
print(Class2.Params.p2)
# print(Class2.Params.p3)

label 2
1234

这些都是类属性,但实例属性应该类似。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-03
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    相关资源
    最近更新 更多