1,抽象基类(Abstract base class或者 ABCs)用于
定义一组必须被类的“鸭子类型”实例实现的方法与属性,可以继承抽象基类本身的类作为类的实例,但是必须提供所有适合的方法。
from collections.abc import Container
class TestContainer:
def __contains__(self,x):
return True
myContainer =TestContainer()
print(isinstance(myContainer,Container)) #True
print(issubclass(TestContainer,Container)) #True
这种就是鸭子类型比传统多态更棒的原因,可以不使用继承关系就你能创建 “是一个”的关系。
2, 创建抽像基类
import abc
class TestAbc(metaclass=abc.ABCMeta):
@abc.abstractmethod
def play(self):
pass
@abc.abstractproperty
def name(self):
pass
# ta=TestAbc()
# print(ta)
class MyAbc(TestAbc):
name="kule"
def play(self):
print("play...")
# mt=MyAbc()
print(isinstance(MyAbc(),TestAbc)) #True
print(issubclass(MyAbc,TestAbc)) #True
MyAbc 是TestAbc的子类,但是没有真正继承TestAbc。
常见的面向对象语言通常在类的接口和接口的实现上有明确的区分,例如interface关键字,用于定义类必须包含的方法,但是不需要实现,这样就抽象出来了一个接口。
任何类都可以明确声明它实现自某个接口。
python的ABCs帮助提供接口的功能,同时也保留了鸭子类型的特点。