我正在编写一个库的扩展,我想用基类中的函数指针字典注册我的新函数。我的理解是,字典,因为它在类中的最上层作用域,是静态的,应该是可更新的。但是,当我试图 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一个更新的字典:

  1. 通过引用更新原始字典 SomeClass.dictionary.
  2. 定义第二个 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中定义的字典。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top