这是我的想法:从一个简单的对象开始:
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/