扩展Python类时更新静态变量
-
21-12-2019 - |
题
我正在编写一个库的扩展,我想用基类中的函数指针字典注册我的新函数。我的理解是,字典,因为它在类中的最上层作用域,是静态的,应该是可更新的。但是,当我试图 update()
扩展类中带有新函数的字典告诉我它是未定义的。下面的最小示例重现了错误:
def somefunction1(v):
return v
def somefunction2(v):
return v
class SomeClass(object):
dictionary = {'a':somefunction1}
class SomeExtensionClass(SomeClass):
dictionary.update({'b':somefunction2})
运行它会出现以下错误
9
10 class SomeExtensionClass(SomeClass):
---> 11 dictionary.update({'b':somefunction2})
NameError: name 'dictionary' is not defined
由于我无法(合理地)修改原始 SomeClass
有什么办法可以解决这个问题吗?
编辑:期望的结果是, SomeExtensionClass
会有 dictionary={'a':somefunction1, 'b':somefunction2}
解决方案
如果要修改 SomeClass.dictionary
, ,只需将其称为 SomeClass.dictionary
:
SomeClass.dictionary.update(whatever)
内的变量查找 class
statement不会查看超类的属性。
如果你想要一本新字典,那么 SomeExtensionClass.dictionary
是不同于 SomeClass.dictionary
, ,你会想要复制原件并更新副本:
class SomeExtensionClass(SomeClass):
dictionary = SomeClass.dictionary.copy()
dictionary.update(whatever)
其他提示
有两种合理的方法可以给SomeExtensionClass一个更新的字典:
- 通过引用更新原始字典
SomeClass.dictionary
. - 定义第二个
dictionary
派生类的变量。
你可以这样做第二个:
class SomeExtensionClass(SomeClass):
dictionary = dict(SomeClass.dictionary, b=somefunction2)
你应该选择哪个取决于谁使用字典和什么。如果SomeClass方法像这样使用变量:
def foo(self):
a = self.dictionary['a']()
该方法将对SomeExtensionClass对象使用SomeExtensionClass字典。如果是这样的话:
def foo(self):
a = SomeClass.dictionary['a']()
它将始终使用SomeClass中定义的字典。
不隶属于 StackOverflow