python之装饰器初识

一、@abstractmethod

1、抽象类的作用:规范编程模式
多人开发、复杂的需求、后期的扩展
是一种用来帮助我们完成规范化的手段

2、如何定义抽象类
1,from abc import ABCMeta,abstractmethod
2,在这个类创建的时候指定 metaclass = ABCMeta
3,在你希望子类要实现的方法的上一行加上一个 @abstractmethod装饰器

3、使用抽象类
1,继承这个类
2,必须实现这个类中被@abstractmethod装饰器装饰的方法

4、实例

# 支付功能

from abc import ABCMeta, abstractmethod
class Payment(metaclass=ABCMeta):  # 模板的功能
    @abstractmethod                               # abstractmethod是一个装饰器,装饰器怎么用?放在函数或者类的上一行
    def pay(self): pass

# 这样就构建了一个抽象类Payment,并声明了子类必须要实现的方法是 pay(),若子类没有定义pay(),则实例化时会报错


class Alipay(Payment):  # 继承了抽象类,就必须实现抽象类中被@abstractmethod装饰器装饰的方法 pay()
    def pay(self, money):
        print('使用支付宝支付了%s元' % money)


class Wechatpay(Payment):
    def pay(self, money):
        print('使用微信支付了%s元' % money)


class My_pay(Payment):  # 这里没有定义pay()方法,那么在实例化的时候机会报错
    def fuqian(self,money):
        print('你支付了%s元' % money)


def pay(obj, money):
    obj.pay(money)


# p = Payment()  # 报错 抽象类不能被实例化

a = Alipay()
# a.pay(100)
pay(a,100)  # 使用支付宝支付了100元

we = Wechatpay()
# we.pay(200)
pay(we,200)  # 使用微信支付了200元

my = My_pay()  # 报错:类中没有定义抽象类的pay方法
pay(my,300)
View Code

二、@property

1、
装饰器的分类:
装饰函数
装饰方法 : property
装饰类

装饰器函数都怎么用:
在函数、方法、类的上面一行直接@装饰器的名字

2、property是一个装饰器函数(就是用来解决刚才私有属性的问题)
property:将一个方法伪装成一个属性

2-1学生信息中,姓名不想给别人修改,就设置为私有属性,在定义一个同名的方法伪装成属性,便于查找

class Student:
    def __init__(self,name,age):
        self.__name = name
        self.age = age

    @property
    def name(self):    # 声明了@property使用此方法的时候就可以不写括号,就伪装成了属性
        return self.__name

xiaoming = Student('小明',18)
print(xiaoming.name)  # 小明

xiaoming.name = '小狗'  # 改:报错
print(xiaoming.name)
View Code

2-2圆的半径可以修改,但是面积和周长应该是属性的形式比较正确,但是直接设置为属性,圆的半径改了后,
周长和面积并不会改变

class Circle:
    def __init__(self,r):
        self.r = r
        self.area = 3.14 * self.r ** 2
        self.perimeter = 2 * 3.14 * self.r
c = Circle(6)
print(c.area)  # 113.04
print(c.perimeter)  # 37.68

c.r = 3  # 改变了半径
print(c.area)  # 113.04
print(c.perimeter)  # 37.68
View Code

2-3因此上面的圆可以写成这样:

class Circle:
    def __init__(self,r):
        self.r = r

    @property
    def area(self):
        return 3.14 * self.r ** 2

    @property
    def perimeter(self):
        return 2 * 3.14 * self.r

c = Circle(6)
print(c.area)  # 113.04
print(c.perimeter)  # 37.68

c.r = 3  # 改变了半径
print(c.area)  # 28.26
print(c.perimeter)  # 18.84
View Code

猜你喜欢

转载自www.cnblogs.com/Zzbj/p/9558144.html