外部类中的Python引用变量

2024-04-26 05:27:11 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

Tags: nameinis语法notoutoneclass
2条回答

当遇到类定义时,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

注意:将第二个类移到第一个类定义之外也是可行的,但这不是重点。你知道吗

您所做的对我来说毫无意义,无论如何,您可以通过将外部类的实例传递给内部类来访问外部类的实例变量。不建议使用嵌套类。您可以使用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

相关问题 更多 >