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'}但这不是优雅的巅峰。
关联:Nested classes' scope? -但是这里我们特别希望访问父类(而不是外部类型)
EDIT2:我实际上想要的是_var = __class__._var-like语法(或hack),或者解释它为什么不存在
发布于 2015-04-25 17:00:46
您可以绕过class语句,使用对type的显式调用。
class Outer(object):
class InnerBase(object): _var = {'foo', 'bar'}
Derived = type('Derived',
(InnerBase,),
{'_var': InnerBase._var | {'baz'}}
)这是因为Derived._var不是通过定义Derived的class语句中的赋值语句设置的,而是从您在与InnerBase本身相同的环境中创建的字典中导入的。
发布于 2015-04-25 16:21:38
Python在封装类语句时从不搜索名称。Mark在他对Python (学习Python )的介绍中使用缩写LEGB来总结范围: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'])当您将这两个类语句嵌套到另一个类语句下时,它们将被排除在名称搜索之外,因为它们已经成为较大类语句的一部分,因此被排除在各个作用域的搜索之外。
发布于 2015-04-25 13:41:35
当你把它放在一种方法中时,它是有效的。
def __init__(self):
_var = Outer.InnerBase._var | {'baz'}
#_var = super(Outer.Derived, self)._var | {'baz'} # or with super
print(_var)因此,我的印象是,这一切都是关于初始化。
https://stackoverflow.com/questions/28734919
复制相似问题