【问题标题】:python OOP class method retaining variable. Weird scoping thingpython OOP 类方法保留变量。奇怪的范围界定
【发布时间】:2019-01-28 21:03:39
【问题描述】:

我有两个类,一个主类创建另一个类的实例。

class Builder:

    def __init__(self, id):
        self.id = id

    def build_thing(self, main_ftr, main_attr, attrs = {}):
        # note the main ftr/attrs gets added to attrs no matter what
        attrs[main_ftr] = attrs.get(main_ftr, []) + [main_attr]

        return Thing(main_ftr, main_attr, attrs)

class Thing:

    def __init__(self, main_ftr, main_attr, attrs):
        self.main_ftr = main_ftr
        self.main_attr = main_attr
        self.attrs = attrs

我遇到的问题与传递给 Thing 类的 attrs 字典有关。问题是每次我使用Builder 类创建Thing 类时, attrs 参数都会保留它以前的值

b = Builder('123')

t = b.build_thing('name', 'john')
print(t.attrs) # {'name': ['john'] }

# Goal is this creates a new "Thing" with only attrs = {'name':['mike']}
t2 = b.build_thing('name', 'mike')
print(t2.attrs) # {'name': ['john', 'mike']}

我的问题分为两部分:

为什么会这样?

我该如何解决?

【问题讨论】:

标签: python class oop dictionary scope


【解决方案1】:

函数的可选参数被初始化一次。由于attrs 是可变的,因此每次调用该函数时,都会将新的键值对添加到此字典中,并保留它以供进一步调用。如果您需要可变数据结构作为默认参数,请使用以下内容:

def build_thing(self, main_ftr, main_attr, attrs=None):
    if attrs is None:
        attrs = {}
    attrs[main_ftr] = attrs.get(main_ftr, []) + [main_attr]
    return Thing(main_ftr, main_attr, attrs)

【讨论】:

  • 奇怪,只是为了澄清一下——这适用于任何采用默认可变参数的函数(与类无关)?因此,该函数在函数/脚本的整个生命周期内都具有与它相关的 arg 值?
  • @RSHAP 没错!
  • @RSHAP 如需更多范围界定,请查看:funcs = [(lambda: x) for x in range(5)] 和 funcs = [(lambda x=x: x) for x in range(5)] 并查看 for f in funcs: print(f()) 与这两个定义之间的区别...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
  • 2012-07-10
  • 2014-09-24
  • 1970-01-01
相关资源
最近更新 更多