python中的函数(也不仅仅是函数)和c中的不太一样,函数本身其实不是callable。函数只是描述了自己是干什么的、接受什么参数等等,既然是描述顾名思义是个descriptor。一个函数真的被调用时python内部隐含了一个根据函数的描述生成一个符合描述的对象的过程,生成的这个对象才是callable的。
class A(object):
def foo(self, arg):
这里foo只是一个描述,不是一个实际的对象(同时,A也是)。
a = A()
根据A的描述,一个对象a生成了,生成的时候,A描述了内部有个foo,对象a内部也生成一个foo。
print(A.foo)
print(a.foo)
会看到一个是funtion,一个是bound method。
至于partial和partialmethod,如官方文档所言,partial生成了一个callable,而partialmethod并没有,只是生成了一个如何生成callable的descriptor。
原始代码可以,是因为本来getMe就可以是一个descriptor,此时其地位和callAPI是一样的。后续使用时在生成Client的对象时其描述中也带了getMe,会生成一个getMe bound method。
方案1不可以,是因为在getattr这个范围和在全局范围中均找不到callAPI这个符号。注意传统c中的成员函数,在python中不在符号表里。顺便说原始的能找到符号是因为其在Client这个范围内。
方案2不可以的原因在前面说了,desc和func的区别以及和实例化对象的关系。
【 在 JulyClyde 的大作中提到: 】
: 我在写一个 telegram bot ,自己寨了一个小的 lib
: ```
: class Client:
: ...................
--
FROM 114.246.236.*