在Python中,可以根据不同的需求选择使用实例方法、类方法或静态方法。
1、实例方法(instance method):
当需要访问和操作实例属性时,应使用实例方法。实例方法的第一个参数通常被命名为self,表示对当前实例的引用。
实例方法可以访问和修改实例属性,也可以调用其他实例方法和类方法。
2、类方法(class method):
当需要访问和操作类属性时,或在创建对象之前需要进行一些准备工作时,应使用类方法。类方法使用@classmethod装饰器定义,第一个参数通常被命名为cls,表示对当前类的引用。
类方法可以访问和修改类属性,也可以调用其他类方法。
3、静态方法(static method):
当实现与类相关但与实例无关的功能时,应使用静态方法。静态方法使用@staticmethod装饰器定义,不需要额外的参数。
静态方法既不能访问实例属性和实例方法,也不能访问类属性和类方法。
4、示例代码
虽然可以根据上述规则选择不同类型的方法,但在实际使用中,有时也可以根据个人偏好和代码风格进行选择。
如何具体使用实例方法、类方法和静态方法呢?根据下面示例代码便可明白!
示例代码1:
-
class
MyClass:
-
class_variable =
"Class Variable"
-
-
def
__init__(
self, instance_variable):
-
self.instance_variable = instance_variable
-
-
def
instance_method(
self):
-
print(
"Instance Method")
-
print(
"Instance Variable:", self.instance_variable)
-
print(
"Class Variable:", self.class_variable)
-
-
@classmethod
-
def
class_method(
cls):
-
print(
"Class Method")
-
print(
"Class Variable:", cls.class_variable)
-
-
@staticmethod
-
def
static_method():
-
print(
"Static Method")
-
-
-
# 使用实例方法:类初始化时必须传参数
-
obj = MyClass(
"Instance Variable")
-
obj.instance_method()
-
-
# 使用类方法
-
MyClass.class_method()
-
-
# 使用静态方法
-
MyClass.static_method()
在上述示例代码中,首先定义了一个名为MyClass的类,包含了一个类变量class_variable和一个实例变量instance_variable,以及三种不同类型的方法:实例方法instance_method、类方法class_method和静态方法static_method。
然后,创建了一个MyClass的实例obj,并调用了实例方法instance_method,该实例方法可以访问和操作实例属性和类属性。
同时,通过类名调用了类方法class_method,该类方法可以访问和操作类属性。
还通过类名调用了静态方法static_method,该静态方法与类和实例无关,无法访问类属性和实例属性。
以上示例展示了如何使用实例方法、类方法和静态方法,根据具体的需求选择相应的方法类型来编写代码。
运行结果:
示例代码2:
-
class
MyClass(
object):
-
-
def
get_info(
self, a, b):
# 定义实例方法,有 self 参数
-
print(
"实例方法", a + b)
-
-
@classmethod
-
def
get_other(
cls, a, b):
# 定义实例方法,有 cls 参数
-
print(
"类方法", a + b)
-
-
@staticmethod
-
def
get_my_class(
a, b):
# 定义静态方法,无默认参数
-
print(
"静态方法", a + b)
-
-
-
class
ExampleClass(
object):
-
def
func(
self):
-
# 实例化
-
-
# 调用实例方法
-
MyClass().get_info(
1,
6)
# 实例方法
-
MyClass.get_info(
'',
1,
6)
# 实例方法
-
-
# 调用类方法,建议通过 类对象.类方法([实参]) 方法调用
-
MyClass.get_other(
1,
6)
# 类方法
-
MyClass().get_other(
1,
6)
# 类方法
-
-
# 调用静态方法,建议通过 类对象.类方法([实参]) 方法调用
-
MyClass.get_my_class(
1,
6)
# 静态方法
-
MyClass().get_my_class(
1,
6)
# 静态方法
-
-
-
if __name__ ==
'__main__':
-
obj = ExampleClass()
-
obj.func()
-
-
print(
"*" *
100)
-
-
obj2 = ExampleClass
-
obj2.func(
1)
运行结果:
示例代码3: 【多线程执行】
-
from concurrent.futures import ThreadPoolExecutor
-
-
-
class BaseClass(object):
-
pass
-
-
-
class MyClass(BaseClass):
-
-
def get_info(self, a, b):
# 定义实例方法,有 self 参数
-
print(
"实例方法", a + b)
-
-
@classmethod
-
def get_other(cls, a, b):
# 定义实例方法,有 cls 参数
-
print(
"类方法", a + b)
-
-
@staticmethod
-
def get_my_class(a, b):
# 定义静态方法,无默认参数
-
print(
"静态方法", a + b)
-
-
-
if __name__ ==
'__main__':
-
with ThreadPoolExecutor(max_workers=3) as executor:
-
for i
in range(5):
-
executor.submit(MyClass.get_info,
'', 1, 6)
-
-
print(
"*" * 100)
-
-
with ThreadPoolExecutor(max_workers=3) as executor:
-
for i
in range(5):
-
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