一、接口与归一化设计
1、接口
<1>含义:自身提供给使用者来调用自身功能的方式方法或入口。
<2>Python中没有相对应的关键字,需要调用,所以我们借用Java中的interface接口关键字来加以说明。
特点:1、接口是一组功能的集合,而不是一个功能;
2、接口的功能用于交互,所有的功能都是public,即别的对象可操作;
3、接口只定义函数,但不涉及函数的实现;
4、这一组功能都是相关的,有一定的相关性。
<3>示例(以Java为例):
#只定义接口和功能,不涉及具体功能的实现
package com.oo.demo;
public interface IAnimal { public void eat(); public void run(); public void sleep(); public void speak(); }
2、为何需要接口?
接口提取了一众类共同的函数,因此可以把接口当作一个函数的集合,然后由子类去实现接口中的函数。
这就是归一化,所谓归一化,就是只要是基于同一个接口实现的类,那么所有的这些类实例的对象在使用时, 用法上都一样。
归化的好处:
<1>归一化让使用者无需关心对象的类是什么,只需要的知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度。
<2>归一化使得高层的外部使用者可以不加区分的处理所有接口兼容的对象集合。
3、在Python中,没有interface的关键字,需要借助第三方模块:http://pypi.python.org/pypi/zope.interface
也能实现继承,有两种用途:
<1>继承基类的方法,并且做出自己的改变或者扩展(代码重用),但实际中,容易出现子类和基类强耦合;
<2>声明某个子类兼容于基类,定义一个接口类,类似Java的interface,接口类定义了一些接口名,即函数名,并且是未实现的功能,子类继承接口类,并且实现接口类中的功能。
因此需要用到抽象类。
二、抽象类
1、定义:
python有抽象类的概念但是需要借助模块实现,抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化。
2、为什么需要抽象类
通俗来说,就是类是从一堆对象中抽取相同的内容而来,而抽象类则是从一堆类中抽取相同的内容而来,内容包括数据属性和函数属性。
从实现角度来看,抽象类与普通类的不同之处在于:抽象类中只能有抽象方法(没有实现功能),该类不能被实例化,只能被继承,且子类必须实现抽象方法。
3、示例:
import abc # 抽象类必须导入
class Animal(metaclass=abc.ABCMeta): # 抽象类,类似Java语言的interface关键字
@abc.abstractmethod # 保证子类必须按照规范实现以下方法
def walk(self):
pass
@abc.abstractmethod
def run(self):
pass
'''
抽象类也是类的一种,区别在于它只能被继承,不能实例化,作用是统一标准,规范子类,特点是抽象类定义的方法子类必须全部实现,且方法名必须一致
'''
class People(Animal):
def walk(self):
print('walking now')
def run(self):
print('runing now')
class Dog(Animal):
def walk(self):
print('walking now')
def run(self):
print('runing now')
class Cat(Animal):
def walk(self):
print('walking now')
def run(self):
print('runing now')
person = People()
dog = Dog()
cat = Cat()
person.run() # runing now
dog.walk() # walking now
4、抽象类与接口
抽象类的本质还是类,指的是一组类的相似性,包括数据属性和函数属性(如walk、run),而接口只强调函数属性的相似性。
抽象类是一个介于类和接口直接的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计。