向现有对象实例添加方法

我读过,可以在Python中向现有对象(即不在类定义中)添加方法。

我了解这样做并不总是一件好事。但是怎么可能呢?


素胚勾勒不出你
浏览 179回答 4
4回答

江户川乱折腾

在Python中,函数和绑定方法之间存在区别。>>>&nbsp;def&nbsp;foo():...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;"foo"...>>>&nbsp;class&nbsp;A:...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;bar(&nbsp;self&nbsp;):...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;"bar"...>>>&nbsp;a&nbsp;=&nbsp;A()>>>&nbsp;foo<function&nbsp;foo&nbsp;at&nbsp;0x00A98D70>>>>&nbsp;a.bar<bound&nbsp;method&nbsp;A.bar&nbsp;of&nbsp;<__main__.A&nbsp;instance&nbsp;at&nbsp;0x00A9BC88>>>>>绑定方法已“绑定”(描述性强)到一个实例,并且无论何时调用该方法,该实例都将作为第一个参数传递。但是,作为类(而不是实例)的属性的可调用对象仍未绑定,因此您可以在需要时随时修改类定义:>>>&nbsp;def&nbsp;fooFighters(&nbsp;self&nbsp;):...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;"fooFighters"...>>>&nbsp;A.fooFighters&nbsp;=&nbsp;fooFighters>>>&nbsp;a2&nbsp;=&nbsp;A()>>>&nbsp;a2.fooFighters<bound&nbsp;method&nbsp;A.fooFighters&nbsp;of&nbsp;<__main__.A&nbsp;instance&nbsp;at&nbsp;0x00A9BEB8>>>>>&nbsp;a2.fooFighters()fooFighters先前定义的实例也会被更新(只要它们本身没有覆盖属性):>>>&nbsp;a.fooFighters()fooFighters当您要将方法附加到单个实例时,就会出现问题:>>>&nbsp;def&nbsp;barFighters(&nbsp;self&nbsp;):...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;"barFighters"...>>>&nbsp;a.barFighters&nbsp;=&nbsp;barFighters>>>&nbsp;a.barFighters()Traceback&nbsp;(most&nbsp;recent&nbsp;call&nbsp;last): &nbsp;&nbsp;File&nbsp;"<stdin>",&nbsp;line&nbsp;1,&nbsp;in&nbsp;<module>TypeError:&nbsp;barFighters()&nbsp;takes&nbsp;exactly&nbsp;1&nbsp;argument&nbsp;(0&nbsp;given)将函数直接附加到实例时,该函数不会自动绑定:>>>&nbsp;a.barFighters<function&nbsp;barFighters&nbsp;at&nbsp;0x00A98EF0>要绑定它,我们可以在类型模块中使用MethodType函数:>>>&nbsp;import&nbsp;types>>>&nbsp;a.barFighters&nbsp;=&nbsp;types.MethodType(&nbsp;barFighters,&nbsp;a&nbsp;)>>>&nbsp;a.barFighters<bound&nbsp;method&nbsp;?.barFighters&nbsp;of&nbsp;<__main__.A&nbsp;instance&nbsp;at&nbsp;0x00A9BC88>>>>>&nbsp;a.barFighters()barFighters这次,该类的其他实例没有受到影响:>>>&nbsp;a2.barFighters()Traceback&nbsp;(most&nbsp;recent&nbsp;call&nbsp;last): &nbsp;&nbsp;File&nbsp;"<stdin>",&nbsp;line&nbsp;1,&nbsp;in&nbsp;<module>AttributeError:&nbsp;A&nbsp;instance&nbsp;has&nbsp;no&nbsp;attribute&nbsp;'barFighters'通过阅读有关描述符和元类&nbsp;编程的信息,可以找到更多信息。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python