一、内置装饰器
内置装饰器 | 含义 |
---|---|
classmethod | 类方法 |
staticmethod | 静态方法 |
二、普通方法(回顾)
-
定义:
-
第一个自变量为self,代表 实体本身
-
-
呼叫:
-
要有实体化的程序,通过 实体物件.方法名 呼叫
# 1. 类的定义 class MethodClass: class_param = 0 # 类变量 def __init__(self): # 实列变量 self.a = 'abc' def demo_method(self): print('这是一个普通方法') def demo_method2(self): self.demo_method() self.a = 'acb' print('这是一个普通方法') # 定义类方法必须加 classmethod装饰器 @classmethod def class_method(cls): # 类方法,第一个自变量需要改为cls # cls.demo_method() 类方法内,不可以直接呼叫实列方法 # cls.a 类方法内,不可以直接呼叫实列变量 cls.class_method2() # 类方法内,可以直接呼叫类变量与类方法 print('这是一个类方法', cls.class_param) # 类变量是可以直接呼叫的 @classmethod def class_method2(cls): # 类方法,第一个自变量需要改为cls print('这是一个类方法2', cls.class_param) # 呼叫类方法 MethodClass.class_method() # 无需实体化,直接通过 类.方法名 呼叫,也可以通过 实体.方法名 呼叫 # 实体化呼叫 demo = MethodClass() demo.demo_method() # 在呼叫程序中,类和实列都可以直接呼叫类方法 # 呼叫普通方法,需要实体化,要不然会报错 # MethodClass.demo_method()
三、静态方法
-
定义:
-
使用 @staticmethod 装饰器,没有和类本身有关的自变量
-
无法直接使用任何类变量、类方法或者实体方法、实体变量
-
-
呼叫:
-
无需实体化,直接通过 类.方法名 呼叫,也可以通过 实体.方法名 呼叫
# 1. 定义 class MethodsDemo: param_a = 0 # 定义类变量 def demo_method(self): # 普通方法 print('这是一个普通方法') @classmethod def class_method2(cls): # 类方法,第一个自变量需要改为cls print('这是一个类方法2') @staticmethod # 定义静态方法 必须加@staticmethod装饰器 def static_demo(p): """ 静态方法 :return: """ # self./cls. 不可以使用,没有这个自变量 print("静态方法", p) # 无法直接呼叫类变量 # 2. 类呼叫 MethodsDemo.static_demo(5) # 实列物件呼叫 demo = MethodsDemo() demo.static_demo(5)
四、普通方法、类方法、静态方法的区别
名称 | 定义 | 呼叫 | 关键字 | 使用场景 |
---|---|---|---|---|
普通方法 | 至少需要一个自变量self | 实体名.方法名() | 无 | 方法内部涉及到实体物件属性的操作 |
类方法 | 至少需要一个cls自变量 | 类名.方法名() 或者实体名.方法名() | @classmethod | 如果需要对类属性,即静态变量进行限制性操作 |
静态方法 | 无默认自变量 | 类名.方法名() 或者实体名.方法名() | @staticmethod | 无需类或实体参与 |
五、类方法实际案例
1、下面的代码实作的需求是格式化输出时间如果现在需求变更,输入 年、月、日 没法保证格式统一,可能是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}日" year, month, day = 2017, 7, 1 demo = DateFormat(year, month, day) print(demo.out_date())
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_formate(cls, json_date): """ 输入一个字典格式的资料型别,回传(2021,12,17) """ year, month, day = json_date['year'], json_date['month'], json_date['day'] return cls(year, month, day) json_data = {'year': 2021, 'month': 12, 'day': 17} # 使用json格式化,生成想要的日期格式,回传DateFormat实列 demo =DateFormat.json_formate(json_data) print(demo.out_date())
六、静态方法实际案例
-
此方法没有任何和实体、类相关的部分,可以作为一个独立函式使用
-
某些场景下,从业务逻辑来说又属于类的一部分
""" 多轮比赛,每轮由不同的英雄对打 """ class Game: def __init__(self, first_hero, second_hero): self.first_hero = first_hero self.second_hero = second_hero # fight 有和实列变量互动的部分,所有需要定义为一个普通方法 def fight(self): print(f'本轮比赛开始,由{self.first_hero}vs{self.second_hero}') # start 没有和类或实列互动的部分,那么就可以使用@staticmethod @staticmethod def start(): print('游戏开始') Game.start() game1 = Game("Bob", "Jack") game2 = Game('Tom', 'Alice') game1.fight() game2.fight()
本文来自博客园,作者:{jiuyou-emperor},转载请注明原文链接:{https://www.cnblogs.com/jiuyou-emperor/}
0 评论