python - 嵌套类的范围?

标签 python class scope nested inner-classes

我正在尝试了解 Python 中嵌套类的范围。这是我的示例代码:

class OuterClass:
    outer_var = 1
    class InnerClass:
        inner_var = outer_var

类的创建没有完成,我得到了错误:

<type 'exceptions.NameError'>: name 'outer_var' is not defined

尝试 inner_var = Outerclass.outer_var 不起作用。 我明白了:

<type 'exceptions.NameError'>: name 'OuterClass' is not defined

我正在尝试从 InnerClass 访问静态 outer_var

有没有办法做到这一点?

最佳答案

class Outer(object):
    outer_var = 1

    class Inner(object):
        @property
        def inner_var(self):
            return Outer.outer_var

这与其他语言中的类似事情不太一样,并且使用全局查找而不是限定对 outer_var 的访问范围。 (如果您更改名称 Outer 绑定(bind)到的对象,则此代码将在下次执行时使用该对象。)

如果您希望所有 Inner 对象都具有对 Outer 的引用,因为 outer_var 实际上是一个实例属性:

class Outer(object):
    def __init__(self):
        self.outer_var = 1

    def get_inner(self):
        return self.Inner(self)
        # "self.Inner" is because Inner is a class attribute of this class
        # "Outer.Inner" would also work, or move Inner to global scope
        # and then just use "Inner"

    class Inner(object):
        def __init__(self, outer):
            self.outer = outer

        @property
        def inner_var(self):
            return self.outer.outer_var

请注意,嵌套类在 Python 中并不常见,并且不会自动暗示类之间存在任何类型的特殊关系。你最好不要嵌套。 (如果需要,您仍然可以将 Outer 上的类属性设置为 Inner。)

关于python - 嵌套类的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1765677/

相关文章:

python - 使用 Python 抓取网站时设置代理

java - 父类(super class)什么时候没有默认构造函数?

javascript - 如何创建指向此的类范围指针?

r - 错误 : evaluation nested too deeply: infinite recursion/options(expressions=)?

javascript - casperjs:显示调试信息输出的正确方法

c - 如何将 argv[] 值从 main 传递到外部函数

python - df.head() 和 df.head 有什么区别?

python - 使用回溯使二维数组相等

python - 读取同一文件Python的多次行

c++:初始化成员结构的静态字段的正确方法