Python 如何使用在类中定义的类?

Python 如何使用在类中定义的类?,python,python-3.x,Python,Python 3.x,我试图在一个类中定义一个类。我不是想用这个来解决现实世界的问题。我只是想用这段代码学习Python class Foo: class Bar: def __init__(self): self.x = 'Bar' def __init__(self): self.x = 'Foo' self.bar = Bar() def print(self): print('self.x:',

我试图在一个类中定义一个类。我不是想用这个来解决现实世界的问题。我只是想用这段代码学习Python

class Foo:
    class Bar:
        def __init__(self):
            self.x = 'Bar'

    def __init__(self):
        self.x = 'Foo'
        self.bar = Bar()

    def print(self):
        print('self.x:', self.x)
        print('self.bar.x:', self.bar.x)

foo = Foo()
foo.print()
当我尝试执行此代码时,出现以下错误:

Traceback (most recent call last):
  File "demo.py", line 14, in <module>
    foo = Foo()
  File "demo.py", line 8, in __init__
    self.bar = Bar()
NameError: name 'Bar' is not defined
回溯(最近一次呼叫最后一次):
文件“demo.py”,第14行,在
foo=foo()
文件“demo.py”,第8行,在_init中__
self.bar=bar()
NameError:未定义名称“Bar”

出了什么问题?当我们可以定义和使用在函数中定义的函数时,为什么对类不一样呢?我在使用
Bar
class时是否犯了错误?

请改用
Foo.Bar()
,因为
Bar
不是全局名称。

您需要通过
Foo
访问
Bar
Bar
未在模块级别定义)

替换以下行:

self.bar = Bar()
与:

根据:

然后在新的执行框架中执行类的套件(参见第节) ),使用新创建的本地命名空间和 原始全局命名空间。(通常,套件只包含功能 定义。)当类的套件完成执行时,它的执行 框架被丢弃,但其本地名称空间被保存。班级 然后使用基类的继承列表创建对象 以及为属性字典保存的本地名称空间。班级 名称绑定到原始本地命名空间中的此类对象

self.bar = Foo.Bar()
self.bar = self.Bar()