外部类中的Python引用变量

时间:2016-01-28 23:11:56

标签: python oop

如何将外部类的变量分配给内部?这是我最好的尝试:

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

2 个答案:

答案 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

请注意:在第一个类定义之外移动第二个类也有效,但除此之外还有。