Python:使用 Self 并即时向对象添加方法

标签 python self dynamic-method

这是我的想法:从一个简单的对象开始:

class dynamicObject(object):
    pass

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

def someMethod(self):
    pass

这样我就可以做到:

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

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

someObject._someMethod(someObject)

这看起来有点奇怪,因为当一个方法“附加”到一个对象时,这不是 self 暗示的吗?

我是 Python 思维方式的新手,我正试图摆脱 C# 等语言的相同思维过程,所以这里的想法是能够通过挑选和选择我使用的验证方法来创建用于验证的对象想要添加到它而不是制作某种对象层次结构。我认为 Python 的“ self ”想法对我有利,因为我认为该对象会隐式知道将其自身发送到附加到它的方法中。

需要注意的一点是,该方法没有以任何方式附加到对象(完全不同的文件),所以这可能是问题所在?也许通过自己定义方法,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__ 中的键,这不是方法的正确位置。事实上,你根本没有得到一个类方法,只是一个柯里化(Currying)函数。这不仅仅是技术问题。 dynamicObject 的子类将无法继承 someMethod 函数。

关于Python:使用 Self 并即时向对象添加方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3771492/

相关文章:

c# 发出动态方法委托(delegate)以加载参数化构造函数问题

Python kubernetes 客户端请求失败并显示 "unable to get local issuer certificate"

python - 如何在Python中将数据写入csv文件

python - 扭曲的检修孔 : how to access servers in application?

没有 'self'的Python调用方法

c# - 从 C# 源代码发出 IL 操作码

python - 运行 Nipype 教程时 Nibabel 出错

rust - self 的多个部分怎么能在这里借用?这里的 self borrowed mutably 和 immutably 不是一样的吗?

python - 函数是否有一种通用的方法来引用自身?