Python中3种类方法:普通类方法、@classmethod方法和@staticmethod方法

就三种方法之间的异同点简单讨论一下~

一、类的普通方法

class Test():
    def ordinary_method(self):
        print("This is ordinary-method")
        
if __name__=="__main__":
    Test().ordinary_method()

1、类的普通方法需要一个表示对象本身的变量self,以便在方法中获取自身变量。
2、类的普通方法只能通过对象调用,而不能通过类直接调用。

错误示例:
1、不传self

class Test():
    def ordinary_method():
        print("This is ordinary-method")
        
if __name__=="__main__":
    Test().ordinary_method()

报错如下:

Traceback (most recent call last):
File “/usercode/file.py”, line 8, in
Test().ordinary_method()
TypeError: ordinary_method() takes 0 positional arguments but 1 was given

1、类在调用普通方法时,会自动传一个代表自身对象的参数,而如果定义方法时没有声明此参数,则会出现上述错误。
2、理论上该参数可以用任一变量(有特殊作用的除外)表示,但是为了表意明确,统一用self代表类的对象本身。

2、使用类直接调用

class Test():
    def ordinary_method(self):
        print("This is ordinary-method")
        
if __name__=="__main__":
    Test.ordinary_method()

报错如下:

Traceback (most recent call last):
File “/usercode/file.py”, line 8, in
Test.ordinary_method()
TypeError: ordinary_method() missing 1 required positional argument: ‘self’

二、@classmethod和@staticmethod

先看一段代码:

class Test():
    @classmethod
    def class_method(cls):
        print("This is class-method")
        
    @staticmethod
    def static_method():
        print("This is static-method")
        
if __name__=="__main__":
    print("-"*100)
    Test().class_method()
    Test.class_method()
    print("-"*100)
    Test().static_method()
    Test.static_method()
    print("-"*100)

输出如下:

----------------------------------------------------------------------------------------------------
This is class-method
This is class-method
----------------------------------------------------------------------------------------------------
This is static-method
This is static-method
----------------------------------------------------------------------------------------------------

根据以上情况,简单总结下类方法和静态方法的异同:
相同点:

  • 都可以被类直接调用;
  • 都可以被类的对象调用。

不同点:

  • 类方法需要传一个代表类本身的变量cls,静态方法不用;
  • 类方法可以通过cls获取类本身的属性(变量和方法),静态方法只能显式传入。

初步总结,以后继续补充~


版权声明:本文为weixin_43879167原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。