【发布时间】:2021-12-10 20:54:00
【问题描述】:
如何判断一个对象是否为类方法?使用 instance() 不是最佳实践吗?如何让它发挥作用?
class Foo:
class_var = 0
@classmethod
def bar(cls):
cls.class_var += 1
print("class variable value:", cls.class_var)
def wrapper(wrapped: classmethod):
"""
Call the wrapped method.
:param wrapped (classmethod, required)
"""
wrapped()
Foo.bar()
wrapper(Foo.bar)
print("the type is:", type(Foo.bar))
print("instance check success:", isinstance(Foo.bar, classmethod))
输出:
class variable value: 1
class variable value: 2
the type is: <class 'method'>
instance check success: False
Process finished with exit code 0
【问题讨论】:
-
classmethod没有命名方法对象的类型。为此,您可能想使用Callable。 -
因为
classmethod实现了描述符协议,所以您必须检查Foo.__dict__['bar'],因为Foo.bar会生成method的实例。 -
虽然
classmethod是一种类型,并且应用@classmethod装饰器确实会从一个函数中创建一个classmethod实例,但稍后在类中查找该名称仍然会给您一个普通的方法实例。这是由于描述符协议的工作方式。 (虽然这实际上只是表达@chepner 所说的另一种方式。) -
仅供参考。 Callable 为每种类型的方法和函数返回 True。
标签: python class-method isinstance