day21_抽象类、鸭子类
抽象类、鸭子类
1 抽象类
即必须以父类定义的方法属性为标准
子类在定义时,一定要按照这个标准定义出这些方法名,至于方法的功能设计则不做限制
使用方式:
import abc # 导入abc模块
class Foo(metaclass=abc.ABCMeta): #参数固定写法
@abc.abstractmethod # 在需要设置为抽象类标准方法的方法属性上方添加语法糖
def func(self):
print('别看了')
验证:
import abc # 导入abc模块
class Foo(metaclass=abc.ABCMeta): #参数固定写法
@abc.abstractmethod
def func(self):
print('小崽子们,照着我的名字来!')
def func2(self):
print('不需要复制我的名字!')
name = '我不能成为抽象类的标准属性'
# 不按照抽象类标准方法定义
class Boo(Foo):
def m1(self):
print('你能看到我的时候,你就成功了')
# 按照抽象类标准方法定义
class Boo2(Foo):
def func(self):
super().func() # 基于继承背景下,对象属性的的重用
print('好的,按照你的名字来,大佬!')
def m1(self):
print('你能看到我的时候,你就成功了')
# 实例化之前,定义阶段,不会报错
# 实例化类Boo
# 实例化的时候就报错:TypeError: Can't instantiate abstract class Boo with abstract methods func
boo = Boo()
boo.m1()
# 实例化Boo2
boo2 = Boo2()
boo2.m1()
boo2.func()
'''
你能看到我的时候,你就成功了
小崽子们,照着我的名字来!
好的,按照你的名字来,大佬!'''
2 鸭子类
程序员编程时,按照给定的规范去定义类的方法,而不是通过python语法强制要求
1、按照给定的规范或者字形定义的规范定义类A
2、定义类B,定义之前,先判定B是不是A的子类,是不是具有A的属性,如果是,那么定义B的时候,就把跟A的属性相同的属性定义为同一个名字
目的是:不用继承父类,也能达到具有继承背景相似的效果,同时,具有更高的扩展性