如何向classmethod传入任意对象作为首个参数——绕过类参数自动注入
如何向classmethod传入自定义的cls参数?
当然可以实现,核心是利用classmethod作为描述符的特性,绕过它自动绑定当前类的逻辑,有两种直接的方式:
方法一:调用原始函数(__func__属性)
classmethod装饰后的方法会把原始函数存在__func__属性里,直接调用这个原始函数就能手动传入任意对象作为第一个参数,和普通方法的调用方式一致:
class Foo: @classmethod def cls_method(cls): print(f"当前使用的cls: {cls}") # 手动传入object作为cls参数 Foo.cls_method.__func__(object())
方法二:通过描述符的__get__方法绑定自定义cls
classmethod是描述符类型,它的__get__方法可以接受instance和owner两个参数。当传入instance=None时,owner会被当作cls绑定到方法上,这样就能得到一个绑定了自定义cls的方法:
class Foo: @classmethod def cls_method(cls): print(f"当前使用的cls: {cls}") # 绑定object作为cls,生成可调用的方法 custom_bound_method = Foo.cls_method.__get__(None, object) custom_bound_method()
运行以上两种方式,都会输出当前使用的cls: <class 'object'>,达到手动指定cls的效果。
内容的提问来源于stack exchange,提问作者Daraan
相关产品推荐
相关产品推荐

