一、@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)
二、@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)
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
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