微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将功能分配给对象属性

如何解决将功能分配给对象属性

| 根据我对Python数据模型的理解,特别是“实例方法”小节,每当您读取其值的类型为“用户定义的函数”的属性时,就会发现一些魔术效果,绑定实例方法,而不是实际的原始函数。这就是为什么在调用方法时不显式传递
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
属性时,我希望魔术能起作用,并为我提供一个不带参数的绑定实例方法(就像我不替换ѭ3get时得到的一样)。取而代之的是,它似乎还给我传递的完全相同的函数,参数“ 0”以及所有参数。方法绑定魔术没有发生。 当我在类声明中定义方法时,为什么方法绑定魔术有效,但在分配属性时却无效?是什么让Python对这些情况有不同的对待? 如果有什么不同,我正在使用python3。     

解决方法

        这是您的操作方式:
import types
class Scriptable:
    def __init__(self,script = None):
        if script is not None:
            self.script = types.MethodType(script,self)   # replace the method
    def script(self):
        print(\"greetings from the default script\")
如评论中的ba__friend所述,方法存储在
class
对象上。从实例访问属性时,类对象上的描述符将函数作为绑定方法返回。 当您将功能分配给“ 9”时,不会发生任何特殊情况,因此您必须自己包装该功能。     ,        感谢Alex Martelli的回答,这里是另一个版本:
class Scriptable:
    def script(self):
        print(self)
        print(\"greetings from the default script\")

def another_script(self):
    print(self)
    print(\"greetings from the another script\")

s = Scriptable()
s.script()

# monkey patching:
s.script = another_script.__get__(s,Scriptable)
s.script()
    ,        看这个:
>>> scriptable = Scriptable()
>>> scriptable.script
<bound method Scriptable.script of <__main__.Scriptable instance at 0x01209DA0>>
>>> scriptable = Scriptable(my_script)
>>> scriptable.script
<function my_script at 0x00CF9730>
语句“ 12”仅创建类对象的属性,而没有任何“魔术”。 类定义中的语句
def script(self):
创建一个描述符-特殊对象,实际上使用with0ѭ参数管理所有内容。 您可以在提到的数据模型参考:implementation-descriptors中了解有关Python中的描述符的更多信息。 Raymond Hettinger撰写的另一篇关于Python描述符的精彩文章: 描述符操作指南。     ,        我无法真正回答您的问题,为什么它会那样工作,您必须询问Guido van Rossum,但是我可以给您一个可能的解决方法:
class Scriptable:
    def __init__(self,script = None):
        self._script = script # replace the method
    def script(self):
        if self._script: return self._script(self)
        return self._defaultscript()
    def _defaultscript(self):
        print(\"greetings from the default script\")
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。