0

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

4

2 回答 2

2

如果要修改SomeClass.dictionary,只需将其称为SomeClass.dictionary

SomeClass.dictionary.update(whatever)

语句中的变量查找class不会查看超类的属性。

如果你想要一个新的字典,so SomeExtensionClass.dictionaryis different from SomeClass.dictionary,你需要复制原件并更新副本:

class SomeExtensionClass(SomeClass):
    dictionary = SomeClass.dictionary.copy()
    dictionary.update(whatever)
于 2014-06-04T08:12:19.247 回答
0

有两种合理的方法可以给 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 字典。如果 OTOH 确实如此:

def foo(self):
    a = SomeClass.dictionary['a']()

它将始终使用 SomeClass 中定义的字典。

于 2014-06-04T08:12:31.390 回答