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

2024-10-01 15:49:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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

class dynamicObject(object):
    pass

并且能够在运行中添加预先编写的方法:

^{pr2}$

所以我可以这样做:

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

问题是,它希望我指定_someMethod()的self部分,以便它看起来像这样:

someObject._someMethod(someObject)

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

我对Python的思维方式很陌生,并且正在尝试摆脱C等语言的相同思维过程,所以这里的想法是通过选择我想添加到其中的验证方法来创建一个用于验证的对象,而不是创建某种对象层次结构。我认为Python的“self”思想会对我有利,因为我认为对象会隐式地知道将自己发送到附加到它的方法中。在

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


Tags: 对象方法self语言object方式pass思维
3条回答

虽然下面我试着回答字面上的问题,我想 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的{}。您需要在类中为定义someMethodsomeObject.someMethod来充当方法调用。有关这方面的更多信息,请参阅Raymond Hettinger的essay on descriptors——毕竟,方法只不过是一个描述符!--还有沙拉布·查图尔维迪的essay on attribute lookup。在


还有另一种方法:

^{pr2}$

但这确实是一个令人讨厌的问题,因为您将'someMethod'定义为someObject.__dict__中的一个键,这不是方法的正确位置。实际上,您根本没有得到类方法,只是一个curry函数。这不仅仅是一个技术问题。dynamicObject的子类将无法继承someMethod函数。在

为什么不使用setattr?我发现这种方式更为明确。在

class dynamicObject(object):
    pass

def method():
    print "Hi"

someObject = dynamicObject()
setattr(someObject,"method", method)
someObject.method()

要达到您想要的效果(通过选择我想添加到其中的验证方法来创建一个用于验证的对象),更好的方法是:

class DynamicObject(object):
    def __init__(self, verify_method = None):
        self.verifier = verify_method
    def verify(self):
        self.verifier(self)

def verify1(self):
    print "verify1"

def verify2(self):
    print "verify2"

obj1 = DynamicObject()
obj1.verifier = verify1

obj2 = DynamicObject(verify2)
#equivalent to
#obj2 = DynamicObject()
#obj2.verify = verify2

obj1.verify()
obj2.verify()

相关问题 更多 >

    热门问题