1. 内置类装饰器
1.1 类装饰器
内置装饰器优点:
不需要实例化,可以直接调用
提升代码的可读性
1.2 普通方法
定义:
第一个参数为self,代表 实例本身
调用:
要有实例化的过程,通过 实例对象.方法名 调用
# 1. 定义
class MethodsDemo:
param_a = 0 #类变量
def normal_demo(self): # 定义一个类方法,第一个参数必须为self
"""
普通方法
:return:
"""
print("这是一个普通方法", self.param_a)
# 2. 调用
md = MethodsDemo() #先实例化
md.normal_demo() #通过示例对象去调用方法
1.3 类方法
定义:
使用 @classmethod 装饰器,第一个参数为类本身,所以通常使用cls命名做区分(非强制)
在类内可以直接使用类方法或类变量,无法直接使用实例变量或方法
调用:
无需实例化,直接通过 类.方法名 调用,也可以通过实例.方法名调用
注意:
类方法内不可以直接调用实例方法,也不可以调用实例变量
类和实例都可以直接调用类方法。
使用环境:在不修改原有代码的基础上,进行二次功能拓展。
# 1. 类的定义
class MethodsDemo:
param_a = 0
# 定义类方法必须加 classmethod装饰器
@classmethod
def classmethod_demo(cls):
"""
类方法,第一个参数需要改为cls
:return:
"""
print("类方法", cls.param_a)
# 2. 类的调用
MethodsDemo.classmethod_demo() # 无需实例化,直接调用
1.4 静态方法
定义:
使用 @staticmethod 装饰器,没有和类本身有关的参数
无法直接使用任何类变量、类方法或者实例方法、实例变量
调用:
无需实例化,直接通过 类.方法名 调用,也可以通过 实例.方法名 调用
# 1. 定义
class MethodsDemo:
param_a = 0
@staticmethod
def static_demo():
"""
静态方法
:return:
"""
print("静态方法") # 无法直接调用类变量
# 2. 调用
MethodsDemo.static_demo()
1.5 总结
2. 类方法实际案例
代码实现的需求是格式化输出时间
如果现在需求变更,输入 年、月、日 没法保证格式统一,可能是json,可能是其他格式的字符串,在不修改构造函数的前提下,如何更改代码
class DateFormat:
def __init__(self, year=0, month=0, day=0):
self.year = year
self.month = month
self.day = day
def out_date(self):
return f"输入的时间为{self.year}年,{self.month}月,{self.day}日"
@classmethod
def json_format(cls,json_data):
"""
输入字典格式日期信息
:param json_data:
:return: tuple
"""
year,month,day=json_data["year"],json_data["month"],json_data["day"]
#相当于return DateFormat(),相当于返回一个类的示例对象
return cls(year,month,day)
#json格式的日期
json_data={"year":2022,"month":8,"day":30}
#使用接送格式化生成想要的日期格式,返回Dateformat实例
demo = DateFormat.json_format(json_data)
print(demo.out_date())
3. 静态方法实际案例
此方法没有任何和实例、类相关的部分,可以作为一个独立函数使用
某些场景下,从业务逻辑来说又属于类的一部分
例子:简单工厂方法
# static 使用场景
class HeroFactory:
# staticmethod 使用场景,
# 方法所有涉及到的逻辑都没有使用实例方法或者实例变量的时候
# 伪代码
@staticmethod
def create_hero(hero):
if hero == "ez":
return EZ()
elif hero == "jinx":
return Jinx()
elif hero == "timo":
return Timo()
else:
raise Exception("此英雄不在英雄工厂当中")