首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内类实例作为外部类方法的默认值。

内类实例作为外部类方法的默认值。
EN

Stack Overflow用户
提问于 2018-12-19 13:49:51
回答 1查看 109关注 0票数 2

我想使用内部类的一个实例(在本例中是namedtuple,尽管用class定义的内部类会出现完全相同的症状)作为外部类方法(在本例中是构造函数)的默认值。但是,当从不同的模块导入此代码时,外部类定义似乎缺失了。

示例:

代码语言:javascript
复制
# mymodule.py

from typing import NamedTuple, Tuple

class IdSignal():
    Cfg = NamedTuple('IdSignalCfg', [
        ('nfft', int),
        ('limits', Tuple[float, float]),
        ('min_spacing', float),
        ('nmix', int)])
    Cfg.__new__.__defaults__ = (
        512,
        (1500, 7500),
        200,
        3
    )

    def __init__(self, cfg = IdSignal.Cfg()):
        self.cfg = cfg

现在执行import mymodule抛出:

代码语言:javascript
复制
Exception has occurred: NameError
name 'IdSignal' is not defined
  File "...", line 18, in IdSignal
    def __init__(self, cfg = IdSignal.Cfg()):
  File "...", line 5, in <module>
    class IdSignal():
  ...
    import mymodule

令人困惑的是,pylint和mypy都没有识别出上述代码中的任何错误。

这还能用其他方法实现吗?

我知道我可以使用None作为默认值,并在构造函数中实例化IdSignal.Cfg 。如果这是唯一的解决方案,我想了解为什么上面的代码失败了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-19 13:56:18

在定义__init__时,名称IdSignal尚未绑定到该类。(直到对整个class语句体进行计算,并将评估结果传递给相关的元类之后,才会发生这种情况。)但是,Cfg还不是一个类属性;它只是定义__init__的同一个“作用域”中的名称,因此不需要限定名称。

代码语言:javascript
复制
def __init__(self, cfg=Cfg()):
    self.cfg = cfg

类似于class语句的

代码语言:javascript
复制
class Foo:
    x = 3
    def __init__(self, y):
        self.y = y

大致相当于

代码语言:javascript
复制
# These names don't really matter, but I'm using different
# names than what the attributes will be just to emphasize
# the point that they really are distinct objects before
# the new class is ever created.

class_x = 3

def some_init(self, y):
    self.y = y

Foo = type('Foo', (object,), {'__init__': some_init, 'x': class_x})

注意,名称Foo直到结束时才会出现。class语句并不像模块或函数那样定义新的作用域,但在class语句中定义的名称也不是任何封闭作用域的一部分;将它们看作是类创建后被丢弃的临时名称。

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

https://stackoverflow.com/questions/53852643

复制
相关文章

相似问题

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