【发布时间】:2011-09-22 15:08:20
【问题描述】:
根据我对Python's data model 的理解,特别是“实例方法”小节,每当您读取值为“用户定义函数”类型的属性时,就会出现一些魔法,而您会得到一个绑定的实例方法的实际的,原始的功能。这就是为什么在调用方法时不显式传递 self 参数的原因。
但是,我希望能够用具有相同签名的函数替换对象的方法:
class Scriptable:
def __init__(self, script = None):
if script is not None:
self.script = script # replace the method
def script(self):
print("greetings from the default script")
>>> scriptable = Scriptable()
>>> scriptable.script()
greetings from the default script
>>> def my_script(self):
... print("greetings from my custom script")
...
>>> scriptable = Scriptable(my_script)
>>> scriptable.script()
Traceback (most recent call last):
...
TypeError: script() takes exactly 1 positional argument (0 given)
我正在创建Scriptable 的实例,并将其script 属性设置为具有单个参数的用户定义函数,就像在类中定义的一样。因此,当我阅读scriptable.script 属性时,我希望魔法会发挥作用并给我一个不带参数的绑定实例方法(就像我没有替换script 时得到的一样)。相反,它似乎返回了我传入的完全相同的函数,self 参数和所有。方法绑定魔法没有发生。
为什么当我在类声明中定义方法时方法绑定魔法起作用,但在分配属性时不起作用?是什么让 Python 以不同的方式处理这些情况?
如果有什么不同,我正在使用 Python3。
【问题讨论】:
-
就像大多数魔法一样,如果我做对了,它的设计就是这样做的:“同样重要的是要注意用户定义的函数是 类实例的属性 不转换为绑定方法;仅当函数是类的属性时才会发生这种情况。"使用
self.script语句,您正在创建一个实例属性。静态方法Scriptable.script仍然存在。一种可能的解决方法是在以前的script方法中调用您注入的script。