装饰器不只用于函数,还可用于处理类。它们使开发人员的逻辑意图更明显。

装饰器装饰类的方法:静态方法和类方法。

 

静态实例:

class Cat():
    def __init__(self, breed, age):
        self.breed = breed
        self.age = age

    def cat_age(self):  # 年龄
        return self.age

    def breed(self):
        return self.breed  # 品种

    def __repr__(self):  # 显示属性
        return '{breed},{age}'.format(breed=self.breed, age=self.age)

    @staticmethod  # 静态方法修饰cry
    def cry():
        return 'nyao nyao,日本猫叫声'


chip = Cat('中华田园猫', 4)

print(chip.cry)   #调用不带括号的静态方法,会返回方法的内存位置
print(chip.cry())  # 通过实例chip来调用静态方法
print(Cat.cry())  # 通过类来调用静态方法

 

类方法实例:(注意类方法由创建之前的@classmethod修饰,方法参数为cls而不是self)。

class Cat():
    def __init__(self, breed, age):
        self.breed = breed
        self.age = age

    def cat_age(self):  # 年龄
        return self.age

    def breed(self):
        return self.breed  # 品种

    def __repr__(self):  # 显示属性
        return '{breed},{age}'.format(breed=self.breed, age=self.age)

    @staticmethod  # 静态方法修饰cry
    def cry():
        return 'nyao nyao,日本猫叫声'

    @classmethod  # 必须有此修饰,只供类使用
    def type(cls):
        if cls.__name__ == 'Cat':  # 检查它来自哪个类,如果是Cat类,则输出信息
            return '本土猫'
        else:
            return cls.__name__  # 会检查它来自哪个类,如果是Cat类的子类,则输出该类名称


chip = Cat('中华田园猫', 4)
print(chip.type())  # 进入if条件


class Japanese_Cat(Cat):
    pass


test = Japanese_Cat('日本族', 10)
print(test.type())  # 进入else
G:\pyprojects\venv\Scripts\python.exe G:/pyprojects/zhuangshiqi.py
本土猫
Japanese_Cat

Process finished with exit code 0

 

一些设计框架如web框架或者图形界面设计等,通常会用装饰器来为开发人员自动化一些功能,使其工作更轻松。

例如许多web框架都包含一个@login_required,确保用户得到在站点上执行任何操作之前,已经通过了身份认证。

实例flask框架:

首先pip安装flask