【问题标题】:Wrong syntax when nesting 3 classes in Python?在 Python 中嵌套 3 个类时语法错误?
【发布时间】:2012-12-23 16:14:59
【问题描述】:

是否有一种简单的方法可以在保持所有 3 个级别的同时修复此错误?

从对象派生 ClassA 没有帮助。

提前致谢!

>>> class classA:
...     class classB(object):
...         def __init__(self):
...             self.b = 3
...         class classC(classA.classB):
...             def __init__(self):
...                 super(classC, self).__init__()
...                 self.c = 4
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in classA
  File "<stdin>", line 5, in classB
NameError: name 'classA' is not defined

【问题讨论】:

  • 你为什么要这样做?
  • 类名会更短,代码更易读
  • 另外,想了解为什么 thid=s 不起作用;也许我错过了一些重要的概念
  • classA.classB.classC 不会比classC 短...
  • @glglgl 也许他用这个保存了一个或另一个前缀。

标签: python syntax nested-class


【解决方案1】:

没有。在您定义classC 时,classA 尚不存在。

它只有在它的主体完全执行后才被创建。 (从主体执行创建的 dict 是类创建调用 class = type('classname', (superclass_1, superclass_2, superclass_3), said_dict}) 的一个参数。)

最简单的方法是在同一级别定义它们。

如果绝对需要,您可以稍后修改它们:

class classA:
    pass
class classB(object):
    def __init__(self):
        self.b = 3
class classC(classB):
    def __init__(self):
        super(classC, self).__init__()
        self.c = 4
classA.classB = classB
classB.classC = classC

【讨论】:

  • 在您的答案中添加解释为什么 classA 在类主体中的所有语句都已执行之前不能存在的解释可能很有用。
【解决方案2】:

也许这样的事情会起作用:

class classA:
    pass

class classB(object):
    def __init__(self):
        self.b = 3
classA.classB = classB

class classC(classA.classB):
    def __init__(self):
        super(classC, self).__init__()
        self.c = 4

classA.classB.classC = classC

【讨论】:

  • 除了使最后一行更冗长之外,这并没有为@glglgl 的答案添加任何内容。
  • @Duncan,你是对的,但是当我发布它时,glglgl 的答案没有代码
猜你喜欢
  • 1970-01-01
  • 2017-09-21
  • 1970-01-01
  • 2014-07-19
  • 2012-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多