加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python:使用Self并动态地向对象添加方法

发布时间:2020-12-20 12:17:12 所属栏目:Python 来源:网络整理
导读:这是我的想法:从一个简单的对象开始: class dynamicObject(object): pass 并且能够动态添加预先编写的方法: def someMethod(self): pass 所以我可以这样做: someObject = dyncamicObject()someObject._someMethod = someMethodsomeObject._someMethod()
这是我的想法:从一个简单的对象开始:

class dynamicObject(object):
    pass

并且能够动态添加预先编写的方法:

def someMethod(self):
    pass

所以我可以这样做:

someObject = dyncamicObject()
someObject._someMethod = someMethod
someObject._someMethod()

问题是,它要我指定_someMethod()的self部分,使它看起来像这样:

someObject._someMethod(someObject)

这似乎有点奇怪,因为当一个方法“附加”到一个对象时,它不是自我隐含的吗?

我是Python的新思维方式的新手,我正试图摆脱像C#这样的语言的相同思维过程,因此我想通过选择和选择我想要添加的验证方法来创建一个验证对象而不是制作某种对象层次结构.我认为Python的“自我”想法对我有利,因为我认为该对象会隐含地知道将自己发送到附加到它的方法中.

有一点需要注意,该方法没有以任何方式附加到对象(完全不同的文件),所以可能这是问题?也许通过自己定义方法,self实际上是有问题的方法,因此不能暗示为对象?

解决方法

我想,虽然下面我试图回答字面问题
Muhammad Alkarouri’s answer更好地解决了问题应该如何解决的问题.

将方法添加到类dynamicObject,而不是对象someObject:

class dynamicObject(object):
    pass

def someMethod(self):
    print('Hi there!')

someObject=dynamicObject()
dynamicObject.someMethod=someMethod
someObject.someMethod()
# Hi there!

当你说someObject.someMethod = someMethod时,someObject .__ dict__获取键值对(‘someMethod’,someMethod).

当你说dynamicObject.someMethod = someMethod时,someMethod被添加到dynamicObject的__dict__中.你需要在类中定义someMethod
someObject.someMethod就像一个方法调用.有关这方面的更多信息,请参阅Raymond Hettinger的essay on descriptors – 毕竟,方法只不过是一个描述符! – 和Shalabh Chaturvedi的essay on attribute lookup.

还有另一种方法:

import types
someObject.someMethod=types.MethodType(someMethod,someObject,type(someObject))

但这实在是令人厌恶,因为你将someMethod定义为someObject .__ dict__中的一个键,这不是方法的正确位置.事实上,你根本没有获得类方法,只是一个curried函数.这不仅仅是技术性问题. dynamicObject的子类将无法继承someMethod函数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读