根据我对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'仍然存在。可能的解决方法是在前脚本方法中调用注入的'脚本'。 –