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的属性相同的属性定义为同一个名字

目的是:不用继承父类,也能达到具有继承背景相似的效果,同时,具有更高的扩展性

posted @ 2019-10-12 21:38  W文敏W  阅读(105)  评论(0编辑  收藏  举报