首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在“类范围”中访问派生类中的基类属性

问在“类范围”中访问派生类中的基类属性
EN

Stack Overflow用户
提问于 2015-02-26 05:13:32
回答 3查看 406关注 0票数 4
代码语言:javascript
复制
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,所以类的范围规则对我来说是个麻烦--如果能做个简报会更好。这样做是可行的:

代码语言:javascript
复制
    class Derived(InnerBase): pass
    Derived._var = InnerBase._var | {'baz'}

但这不是优雅的巅峰。

关联:Nested classes' scope? -但是这里我们特别希望访问父类(而不是外部类型)

EDIT2:我实际上想要的是_var = __class__._var-like语法(或hack),或者解释它为什么不存在

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-25 17:00:46

您可以绕过class语句,使用对type的显式调用。

代码语言:javascript
复制
class Outer(object):
    class InnerBase(object): _var = {'foo', 'bar'}
    Derived = type('Derived',
                   (InnerBase,),
                   {'_var': InnerBase._var | {'baz'}}
                  )

这是因为Derived._var不是通过定义Derived的class语句中的赋值语句设置的,而是从您在与InnerBase本身相同的环境中创建的字典中导入的。

票数 2
EN

Stack Overflow用户

发布于 2015-04-25 16:21:38

Python在封装类语句时从不搜索名称。Mark在他对Python (学习Python )的介绍中使用缩写LEGB来总结范围:Python搜索本地作用域,然后搜索任何包含def语句的本地作用域,然后是全局作用域,最后是内置作用域。类语句被排除在这个作用域列表之外;Python不搜索包含类语句的名称。

一种解决办法是不嵌套你的课程。在Python中,使用非嵌套类往往是首选的,因为它的简单性。但是,当然,也有很好的理由去嵌套类。为什么要嵌套InnerBase?我想知道您是否因为在Java方面的经验而嵌套了该类。下面的工作对你也一样好吗?

代码语言:javascript
复制
class InnerBase(object):
    _var = {'foo', 'bar'}

class Derived(InnerBase):
    _var = InnerBase._var | {'baz'}

>>> Derived._var
set(['baz', 'foo', 'bar'])

当您将这两个类语句嵌套到另一个类语句下时,它们将被排除在名称搜索之外,因为它们已经成为较大类语句的一部分,因此被排除在各个作用域的搜索之外。

票数 4
EN

Stack Overflow用户

发布于 2015-04-25 13:41:35

当你把它放在一种方法中时,它是有效的。

代码语言:javascript
复制
    def __init__(self):
        _var = Outer.InnerBase._var | {'baz'}
        #_var = super(Outer.Derived, self)._var | {'baz'}    # or with super
        print(_var)

因此,我的印象是,这一切都是关于初始化。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28734919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档