gpt4 book ai didi

python - 如何在Python中实现模式事件来调用类方法?

转载 作者:行者123 更新时间:2023-12-01 05:05:53 26 4
gpt4 key购买 nike

我想根据事件代码调用一些函数,如何在 Python 中执行此操作?

我编写了这样的代码,但它不起作用,我是用户,只需一步即可使其工作。

class Thing(object):
@classmethod
def do1(cls):
print 'do1'

@classmethod
def do2(cls):
print 'do2'

eventToMethod = {'1': do1,
'2': do2}

@classmethod
def onEvent(cls, name):
method = cls.eventToMethod.get(name)
if method != None:
method()

Thing.onEvent('1')

无论我遇到这样的错误,并且不知道如何以 Python 方式调用类方法。

TypeError: 'classmethod' object is not callable

你能帮忙解决这个简单的问题吗?

最佳答案

首先需要对eventToMethod进行一些修改,不要给它赋值do1do2,最好赋值字符串。您始终可以使用字符串访问类属性。在字典中存储对 do1do2 的引用的问题是它们还不是绑定(bind)方法(它们只是 classmethod 对象(非数据描述符))当您将它们存储在字典中时,只有在类定义完成后,它们才会转换为完全绑定(bind)的类方法。

eventToMethod = {'1': 'do1',
'2': 'do2'}

然后使用getaattr获取方法:

@classmethod
def onEvent(cls, name):
method = getattr(cls, cls.eventToMethod.get(name))
...

请注意,您还可以直接将 'do1' 传递给 onEvent,而不是保留字典来存储名称,然后只需使用:

method = getattr(cls, name)
<小时/>

如果您显式调用 do1do2 描述符的 __get__ 方法,您仍然可以摆脱当前的方法。:

method = cls.eventToMethod.get(name)
if method != None:
method.__get__(None, cls)()

这是有效的,因为这正是 Python 在底层所做的事情,classmethod 是一个非数据描述符,当你执行 Thing.do1 时> Python 实际上调用了 do1__get__ 方法,第一个参数为 None,第二个参数为类型:

>>> Thing.do1.__get__(None, Thing)
<bound method type.do1 of <class '__main__.Thing'>>
>>> Thing.do1.__get__(None, Thing)
<bound method type.do1 of <class '__main__.Thing'>>
>>> Thing.do1
<bound method type.do1 of <class '__main__.Thing'>>
>>> Thing.eventToMethod['1'].__get__(None, Thing) #Using OP's code.
<bound method type.do1 of <class '__main__.Thing'>>

关于python - 如何在Python中实现模式事件来调用类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25055267/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com