python中实例方法、类方法和静态方法的用法区别

在Python中,可以根据不同的需求选择使用实例方法、类方法或静态方法。

1、实例方法(instance method):

        当需要访问和操作实例属性时,应使用实例方法。实例方法的第一个参数通常被命名为self,表示对当前实例的引用。

        实例方法可以访问和修改实例属性,也可以调用其他实例方法和类方法

2、类方法(class method):

        当需要访问和操作类属性时,或在创建对象之前需要进行一些准备工作时,应使用类方法。类方法使用@classmethod装饰器定义,第一个参数通常被命名为cls,表示对当前类的引用。

        类方法可以访问和修改类属性,也可以调用其他类方法。

3、静态方法(static method):

        当实现与类相关但与实例无关的功能时,应使用静态方法。静态方法使用@staticmethod装饰器定义,不需要额外的参数。

        静态方法既不能访问实例属性和实例方法,也不能访问类属性和类方法。

4、示例代码

        虽然可以根据上述规则选择不同类型的方法,但在实际使用中,有时也可以根据个人偏好和代码风格进行选择。

如何具体使用实例方法、类方法和静态方法呢?根据下面示例代码便可明白!

示例代码1:


   
   
  1. class MyClass:
  2. class_variable = "Class Variable"
  3. def __init__( self, instance_variable):
  4. self.instance_variable = instance_variable
  5. def instance_method( self):
  6. print( "Instance Method")
  7. print( "Instance Variable:", self.instance_variable)
  8. print( "Class Variable:", self.class_variable)
  9. @classmethod
  10. def class_method( cls):
  11. print( "Class Method")
  12. print( "Class Variable:", cls.class_variable)
  13. @staticmethod
  14. def static_method():
  15. print( "Static Method")
  16. # 使用实例方法:类初始化时必须传参数
  17. obj = MyClass( "Instance Variable")
  18. obj.instance_method()
  19. # 使用类方法
  20. MyClass.class_method()
  21. # 使用静态方法
  22. MyClass.static_method()

        在上述示例代码中,首先定义了一个名为MyClass的类,包含了一个类变量class_variable和一个实例变量instance_variable,以及三种不同类型的方法:实例方法instance_method、类方法class_method和静态方法static_method。

        然后,创建了一个MyClass的实例obj,并调用了实例方法instance_method,该实例方法可以访问和操作实例属性和类属性。

        同时,通过类名调用了类方法class_method,该类方法可以访问和操作类属性。

        还通过类名调用了静态方法static_method,该静态方法与类和实例无关,无法访问类属性和实例属性。

        以上示例展示了如何使用实例方法、类方法和静态方法,根据具体的需求选择相应的方法类型来编写代码。

运行结果:

示例代码2:


   
   
  1. class MyClass( object):
  2. def get_info( self, a, b): # 定义实例方法,有 self 参数
  3. print( "实例方法", a + b)
  4. @classmethod
  5. def get_other( cls, a, b): # 定义实例方法,有 cls 参数
  6. print( "类方法", a + b)
  7. @staticmethod
  8. def get_my_class( a, b): # 定义静态方法,无默认参数
  9. print( "静态方法", a + b)
  10. class ExampleClass( object):
  11. def func( self):
  12. # 实例化
  13. # 调用实例方法
  14. MyClass().get_info( 1, 6) # 实例方法
  15. MyClass.get_info( '', 1, 6) # 实例方法
  16. # 调用类方法,建议通过 类对象.类方法([实参]) 方法调用
  17. MyClass.get_other( 1, 6) # 类方法
  18. MyClass().get_other( 1, 6) # 类方法
  19. # 调用静态方法,建议通过 类对象.类方法([实参]) 方法调用
  20. MyClass.get_my_class( 1, 6) # 静态方法
  21. MyClass().get_my_class( 1, 6) # 静态方法
  22. if __name__ == '__main__':
  23. obj = ExampleClass()
  24. obj.func()
  25. print( "*" * 100)
  26. obj2 = ExampleClass
  27. obj2.func( 1)

运行结果:

示例代码3:  【多线程执行】


   
   
  1. from concurrent.futures import ThreadPoolExecutor
  2. class BaseClass(object):
  3. pass
  4. class MyClass(BaseClass):
  5. def get_info(self, a, b): # 定义实例方法,有 self 参数
  6. print( "实例方法", a + b)
  7. @classmethod
  8. def get_other(cls, a, b): # 定义实例方法,有 cls 参数
  9. print( "类方法", a + b)
  10. @staticmethod
  11. def get_my_class(a, b): # 定义静态方法,无默认参数
  12. print( "静态方法", a + b)
  13. if __name__ == '__main__':
  14. with ThreadPoolExecutor(max_workers=3) as executor:
  15. for i in range(5):
  16. executor.submit(MyClass.get_info, '', 1, 6)
  17. print( "*" * 100)
  18. with ThreadPoolExecutor(max_workers=3) as executor:
  19. for i in range(5):
  20. executor.submit(MyClass().get_info, 1, 5)

运行结果:

https://www.bilibili.com/opus/667065703101104137
https://baijiahao.baidu.com/s?id=1800441226279536701&wfr=spider&for=pc
https://geek-docs.com/python/python-askanswer/11_python_staticmethod_vs_classmethod_in_python.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值