拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 python内装饰器

python内装饰器

白鹭 - 2022-03-07 2110 0 0

一、内置装饰器

内置装饰器含义
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 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *