热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《内部类的实例作为外部类方法的默认值》经验,为你挑选了1个好方法。

我想使用内部类的实例(在这种情况下,namedtuple尽管对于定义的内部类,出现完全相同的症状class)作为外部类方法的默认值(在本例中为构造函数).但是,当从其他模块导入此代码时,外部类定义似乎缺失.

例:

# 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抛出:

Exception has occurred: NameError
name 'IdSignal' is not defined
  File "...", line 18, in IdSignal
    def __init__(self, cfg = IdSignal.Cfg()):
  File "...", line 5, in 
    class IdSignal():
  ...
    import mymodule

令人困惑的是,pylint和mypy都无法识别上述代码中的任何错误.

这可以通过其他方式实现吗?

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



1> chepner..:

__init__定义时,名称IdSignal尚未绑定到类.(在评估语句的整个主体之前不会发生这种情况class,并且该评估的结果将传递给相关的元类.)但是,Cfg它还不是类属性; 它只是在定义的相同"范围"中的名称__init__,因此您无需限定名称.

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

class像这样的陈述

class Foo:
    x = 3
    def __init__(self, y):
        self.y = y

大致相当于

# 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的任何封闭范围的陈述部分; 将它们视为临时名称,在创建类后将其丢弃.


推荐阅读
author-avatar
起五贪黑_719
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有