当看到一只鸟 走起来像鸭子,游泳起来像鸭子,叫起来也像鸭子。
那么这只鸟就可以被称为鸭子。
"""
定义三个类,猫 狗 鸭子
"""classCat(object):defsay(self):print("i an a cat")classDog(object):defsay(self):print("i an a dog")
classDuck(object):defsay(self):print("i an a duck")
animal = Cat
animal().say()
animal_list =[Cat,Dog,Duck]for animal in animal_list:
animal().say()"""
java
会写一个anamal类
并且指明子类继承某个类并且重写父方法
Aniaml an =Cat()
an.say
python
可以不继承继承其中任何父类
需要做的就是 都要去取say这个父方法
鸭子:
所有的类,都实现了一个共同的方法,这个方法名字是一样的
#####################################################################
可迭代对象:iterable
list set 等待,
例如extend方法,会调用__iter__ 或者__getitem__
a = [1,2]
b = [3,4]
a.enxtend(b)
b不一定是list,只要是可迭代的对象就可以实现,是因为都实现了以上的魔法函数
魔法函数,充分的利用了鸭子类型。
#####################################################################
"""
抽象基类 abc模块
"""
python是动态语言,是没有变量类型的,可以指向任何类型。
动态语言 只有运行的时候,才能知道错误。
动态语言少了编译时,检查错误的环节
python信奉的是鸭子类型,贯穿python整个设计理念。
python的一个类,到底有什么特性或者属于类型
是看里面到底实现了哪些魔法函数
抽象基类:
首先,抽象基类是不能实例化的。
所有继承这个基类的类,必须覆盖 基类 设定好的方法
"""# 我们去检查某各类是否有某种方法classCompany(object):def__init__(self,employee_list):
self.employee = employee_list
def__len__(self):returnlen(self.employee)
com = Company(["1","2"])print(len(com))# 判断是否有 __len__这个函数 True/Falsehasattr(com,"__len__")"""
java的话,更倾向于判断是否 是指定的类型
isinstance(com,Sized)
python
from collections.ab import Sized
isinstance(com,Sized)
"""# @abc.abstractmethod"""
# 我们需要强制某个子类必须实现某个方法
例如 实现了一个web框架,集成cache(未来可以使用redis,cache,memorychache)
需要设计一个抽象基类,指定子类必须实现某些方法
import abc
class Dog(metaclass=abc.ABCMeta):
@abc.abstractmethod
def say(self):
pass
class A(Dog):
pass
A()
这样如果A 继承Dog类,没有实现say方法的话,是不能实例化的。
TypeError: Can't instantiate abstract class A with abstract methods say
"""