python 的方法和函数,基本上函数等同于方法。

python 的类方法分三种:

  1. 实例方法,属于具体实例对象
  2. 类方法,该类对象,及该类实例对象可调用的,使用 @classmethod 装饰器
  3. 静态方法,直接调用,使用 @staticmethod 装饰器

参考:[Python]实例方法、类方法、静态方法

类与实例

类是模板,可用于定义具体对象的属性;
实例,使用个类的具体对象,具备自己特定的属性值。

实例方法、类方法、静态方法

my_method.py 文件

  1. # coding=utf-8
  2. class My_class(object):
  3. """测试python 的 实例方法、类方法、静态方法"""
  4. def instance_method(self, age=None):
  5. """
  6. 实例方法
  7. 第一个参数是实例对象,一般使用 self 代替
  8. 调用的时候需要实例化一个对象,然后使用
  9. """
  10. # pass
  11. print("我是实例方法", id(self))
  12. @classmethod
  13. def class_method(cls, age=None):
  14. """
  15. 类方法
  16. 第一个参数是类对象,使用 cls 代替
  17. 调用的时候可以使用类对象,也可以是类对象的实例
  18. :param age:
  19. :return:
  20. """
  21. # pass
  22. print("我是类方法", id(cls))
  23. @staticmethod
  24. def static_method(age=None):
  25. """
  26. 静态方法
  27. 可以没有参数
  28. 调用可以是类对象,也可以是类对象的实例
  29. :param age:
  30. :return:
  31. """
  32. # pass
  33. print("我是静态方法", id(My_class))
  34. def main():
  35. # 类对象直接调用方法
  36. My_class.class_method(20)
  37. My_class.instance_method(21)
  38. My_class.static_method(22)
  39. print("==" * 30)
  40. # 实例化对象
  41. my_class = My_class()
  42. # 实例化对象,调用方法
  43. my_class.class_method()
  44. my_class.instance_method()
  45. my_class.static_method()
  46. if __name__ == "__main__":
  47. print("---" * 20)
  48. # pass
  49. main()
  50. class My_Class_2(object):
  51. """第二测试方法的类"""
  52. def instance_method(self, age=None):
  53. print("instance_method")
  54. @classmethod
  55. def class_method(cls, age=None):
  56. print("class_method")
  57. @staticmethod
  58. def static_method(age=None):
  59. print("static_method")
  60. class My_Class_3(object):
  61. """第二测试方法的类"""
  62. def instance_method(self, age=None):
  63. print("3 instance_method")
  64. @classmethod
  65. def class_method(cls, age=None):
  66. print("3 class_method")
  67. @staticmethod
  68. def static_method(age=None):
  69. print("3 static_method")
  70. class My_Class_4(object):
  71. """测试python 的 实例方法、类方法、静态方法"""
  72. def instance_method(self, age=None):
  73. """
  74. 实例方法
  75. 第一个参数是实例对象,一般使用 self 代替
  76. 调用的时候需要实例化一个对象,然后使用
  77. """
  78. # pass
  79. print("C4 我是实例方法", id(self))
  80. @classmethod
  81. def class_method(cls, age=None):
  82. """
  83. 类方法
  84. 第一个参数是类对象,使用 cls 代替
  85. 调用的时候可以使用类对象,也可以是类对象的实例
  86. :param age:
  87. :return:
  88. """
  89. # pass
  90. print("4 我是类方法", id(cls))
  91. @staticmethod
  92. def static_method(age=None):
  93. """
  94. 静态方法
  95. 可以没有参数
  96. 调用可以是类对象,也可以是类对象的实例
  97. :param age:
  98. :return:
  99. """
  100. # pass
  101. print("4 我是静态方法", id(My_class))

test_method.py 文件

  1. # coding=utf-8
  2. import time
  3. import my_method
  4. if __name__ == "__main__":
  5. # my_method.main()
  6. print("=="*30)
  7. print("=="*30)
  8. # 类对象直接调用方法
  9. my_method.My_class.class_method(20)
  10. my_method.My_class.instance_method(21)
  11. my_method.My_class.static_method(22)
  12. print("==" * 30)
  13. # # 实例化对象
  14. my_class = my_method.My_class()
  15. # 实例化对象,调用方法
  16. my_class.class_method()
  17. my_class.instance_method()
  18. my_class.static_method()
  19. print("--"*30)
  20. print("--"*30)
  21. my_method.My_Class_2.static_method()
  22. my_method.My_Class_2.class_method()
  23. # my_method.My_Class_2.instance_method()
  24. # my_method.My_Class_2
  25. print("--"*30)
  26. print("--"*30)
  27. my_method.My_Class_3.static_method()
  28. my_method.My_Class_3.class_method()
  29. # my_method.My_Class_3.instance_method()
  30. # my_method.My_Class_3
  31. print("--" * 30)
  32. print("--" * 30)
  33. my_method.My_Class_4.static_method()
  34. my_method.My_Class_4.class_method()
  35. # my_method.My_Class_4.instance_method()
  36. # my_method.My_Class_4
  37. time.sleep(1)
  38. my_method.My_class.instance_method()

运行 tet_method.py 结果:

  1. D:\devTools\Python\Miniconda3\envs\python38\python.exe D:/OtherProjects/action/practice-demo-python/py_38/drf_demo/drf_demo/test_method.py
  2. ============================================================
  3. ============================================================
  4. 我是类方法 2140269657328
  5. 我是实例方法 140708077379968
  6. 我是静态方法 2140269657328
  7. ============================================================
  8. 我是类方法 2140269657328
  9. 我是实例方法 2140301132080
  10. 我是静态方法 2140269657328
  11. ------------------------------------------------------------
  12. ------------------------------------------------------------
  13. static_method
  14. class_method
  15. ------------------------------------------------------------
  16. ------------------------------------------------------------
  17. 3 static_method
  18. 3 class_method
  19. ------------------------------------------------------------
  20. ------------------------------------------------------------
  21. 4 我是静态方法 2140269657328
  22. 4 我是类方法 2140269652608
  23. Traceback (most recent call last):
  24. File "D:/OtherProjects/action/practice-demo-python/py_38/drf_demo/drf_demo/test_method.py", line 43, in <module>
  25. my_method.My_class.instance_method()
  26. TypeError: instance_method() missing 1 required positional argument: 'self'
  27. Process finished with exit code 1
  1. 令人困惑的是,前面的 my_method.My_class.instance_method() 方法可以,后面的就不可以,不应该是都不可以吗?

小结

  1. 定义形式上:

a. 类方法和静态方法都是通过装饰器实现的,实例方法不是;
b. 实例方法需要传入self参数,类方法需要传入cls参数,而静态方法不需要传self或者cls参数。
2. 调用方式上:
实例方法只能通过实例对象调用;类方法和静态方法可以通过类对象或者实例对象调用,如果是使用实例对象调用的类方法或静态方法,最终都会转而通过类对象调用。
3. 应用场景:
a. 实例方法使用最多,可以直接处理实例对象的逻辑;类方法不需要创建实例对象,直接处理类对象的逻辑;静态方法将与类对象相关的某些逻辑抽离出来,不仅可以用于测试,还能便于代码后期维护。
b. 实例方法和类方法,能够改变实例对象或类对象的状态,而静态方法不能。