如何将外部类的变量分配给内部?这是我最好的尝试:
in [1]: class one:
...: x = 1
...: class two:
...: y = x
...:
---------------------------------------------------------------------------
NameError: name 'x' is not defined
我很困惑为什么这不起作用,但Python对这种语法没有问题:
In [1]: x = 1
In [2]: class one:
...: y = x
...: class two:
...: z = x
...:
In [3]: one.two.z
Out[3]: 1
答案 0 :(得分:0)
你所做的事对我来说毫无意义,无论如何,你可以通过将其实例传递给内部类来访问外部类的实例变量。不建议使用嵌套类。您可以使用Inheritance
来实现此目的。
class Outer:
def __init__(self):
self._x = 1
def create_inner(self):
"""passes outer class instance into Inner"""
return Outer.Inner(self)
class Inner:
def __init__(self, outer):
self._outer = outer
self._y = self._outer._x
def print_y(self):
print self._y
outer = Outer()
inner = outer.create_inner()
inner.print_y()
输出:
1
答案 1 :(得分:-1)
当遇到类定义时,Python将不经思考地执行主体。
首先,它会执行class one
,在执行正文时(在实际创建类之前),它会遇到class two
所以它会执行它。
在class two
内,它会看到仍然不存在的one
引用,因此会引发NameError
。
通过将第二个类定义包装在函数中,可以通过一种简单的方式来查看Python处理类/函数的方式。由于Python只有编译函数并且不执行它们,所以class one
将被创建:
class one:
x = 1
def wrap():
class two:
y = one.x
one.two = two
现在one
作为一个类存在。如果执行one.wrap
第二个类定义将被执行,那么将找到one
类,然后,只需跟随您的原始示例;我将课程two
设置为one
的属性,以获得与您相同的效果。
因此,名称解析工作正常,而two
类现在具有类one
的属性:
one.wrap()
one.two.y
Out[22]: 1
请注意:在第一个类定义之外移动第二个类也有效,但除此之外还有。