class Outer(object):
class InnerBase(object): _var = {'foo', 'bar'}
class Derived(InnerBase):
_var = _var | {'baz'} # NameError: name '_var' is not defined
_var = InnerBase._var | {'baz'} # name 'InnerBase' is not defined
_var = Outer.InnerBase._var | {'baz'} # free variable 'Outer'
# referenced before assignment in enclosing scope
将 _var 移入Outer
没有帮助 - 将其移动到模块范围内会起作用,但违背了拥有类的目的。那么该怎么做呢?
编辑:来自 Java,所以类的范围规则对我来说是一个令人头疼的问题 - 如果有简报,我将不胜感激。顺便说一句,这有效:
class Derived(InnerBase): pass
Derived._var = InnerBase._var | {'baz'}
但这并不是优雅的顶峰。
有关的:嵌套类的范围?- 但这里我们特别想访问我们的父类(而不是外部类型)
EDIT2:我实际上追求的是_var = __class__._var
-类似语法(或 hack),或解释why它不在那里
Python 从不搜索封闭类语句中的名称。马克·鲁茨 (Mark Lutz) 使用缩写词LEGB在他的 Python 简介中总结了范围(学习Python): Python 搜索本地作用域,然后搜索任何封闭的本地作用域def
语句,然后是全局作用域,最后是内置作用域。类语句不在此范围列表中; Python 不会搜索包含类语句的名称。
一种解决方案是取消类的嵌套。在 Python 中,由于其简单性,通常首选使用非嵌套类。但是,当然,嵌套类也有充分的理由。你为何嵌套InnerBase
?我想知道您是否可能因为您在 Java 方面的经验而嵌套了该类。以下内容对您也同样有效吗?
class InnerBase(object):
_var = {'foo', 'bar'}
class Derived(InnerBase):
_var = InnerBase._var | {'baz'}
>>> Derived._var
set(['baz', 'foo', 'bar'])
当您将这两个类语句嵌套在另一个类语句下时,它们将被排除在名称搜索之外,因为它们已成为更大的类语句的一部分,因此被排除在各种范围的搜索之外。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)