静态方法和类方法的区别

发布于 2022-02-17 09:47:17

@staticmethod装饰的功能和用装饰的功能有什么区别@classmethod

关注者
0
被浏览
51
1 个回答
  • 面试哥
    面试哥 2022-02-17
    为面试而生,有面试问题,就找面试哥。

    也许一些示例代码会有所帮助:注意foo,class_foo和的调用签名的区别static_foo

    class A(object):
        def foo(self, x):
            print(f"executing foo({self}, {x})")
    
        @classmethod
        def class_foo(cls, x):
            print(f"executing class_foo({cls}, {x})")
    
        @staticmethod
        def static_foo(x):
            print(f"executing static_foo({x})")
    
    a = A()
    

    下面是对象实例调用方法的常用方式。对象实例 ,a作为第一个参数隐式传递。

    a.foo(1)
    # executing foo(<__main__.A object at 0xb7dbef0c>, 1)
    

    使用 classmethods,对象实例的类作为第一个参数隐式传递而不是self.

    a.class_foo(1)
    # executing class_foo(<class '__main__.A'>, 1)
    

    您也可以class_foo使用该类进行调用。实际上,如果您将某物定义为类方法,那可能是因为您打算从类而不是从类实例中调用它。A.foo(1)会引发 TypeError,但A.class_foo(1)工作正常:

    A.class_foo(1)
    # executing class_foo(<class '__main__.A'>, 1)
    

    使用 staticmethodsself(对象实例)和cls(类)都不会 作为第一个参数隐式传递。它们的行为类似于普通函数,只是您可以从实例或类中调用它们:

    a.static_foo(1)
    # executing static_foo(1)
    
    A.static_foo('hi')
    # executing static_foo(hi)
    

    静态方法用于对与类有某种逻辑联系的函数进行分组。


    foo只是一个函数,但是当您调用时,您a.foo不仅会获得该函数,还会获得该函数的“部分应用”版本,并将对象实例a绑定为该函数的第一个参数。foo需要 2 个参数,而a.foo只需要 1 个参数。

    a绑定到foo. 这就是下面“绑定”一词的含义:

    print(a.foo)
    # <bound method A.foo of <__main__.A object at 0xb7d52f0c>>
    

    a.class_fooa不是绑定到class_foo,而是类A绑定到class_foo

    print(a.class_foo)
    # <bound method type.class_foo of <class '__main__.A'>>
    

    在这里,使用静态方法,即使它是一个方法,也a.static_foo只是返回一个没有参数绑定的好 ‘ole 函数。static_foo期望 1 个参数,也 a.static_foo期望 1 个参数。

    print(a.static_foo)
    # <function static_foo at 0xb7d479cc>
    

    当然,当您改为static_foo与班级通话时,会发生同样的事情A

    print(A.static_foo)
    # <function static_foo at 0xb7d479cc>
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看