概念
两者区别
一些可能出现的问题
需要引入abc模块后实现,不能实例化
继承后可以实例化
必须要实现他的抽象方法
@property让方法秒变“属性”
from abc import abstractmethod, ABCMeta
class GraphicRule(metaclass=ABCMeta):
"""图形接口类"""
@abstractmethod
def area(self):
"""面积"""
pass
@abstractmethod
def perimeter(self):
"""周长"""
pass
class Rectangle(GraphicRule):
"""矩形类"""
def __init__(self, b, h):
self.b = b
self.h = h
@property
def area(self):
return self.b*self.h
@property
def perimeter(self):
return (self.b+self.h)*2
rect1 = Rectangle(3, 7)
# (1)注释以下的方法调用
# print("矩形面积:{}".format(rect1.area()))
# print("矩形周长:{}".format(rect1.perimeter()))
# (2)属性调用
print("矩形面积:{}".format(rect1.area))
print("矩形周长:{}".format(rect1.perimeter))
# =======控制台输出结果=======
矩形面积:21
矩形周长:20
具体实现
from abc import ABCMeta, abstractclassmethod
class Duck(metaclass=ABCMeta):
mouth = None
ear = None
eye = None
@abstractclassmethod
def eat(self):
pass
class FlyEnable(metaclass=ABCMeta):
@abstractclassmethod
def fly(self):
pass
class FlyWithWings(FlyEnable):
def fly(self):
print("fly with wings")
class DuckA(Duck, FlyWithWings):
def eat(self):
print("duckA eat ...")
ducka = DuckA()
ducka.eat()
ducka.fly()
返回值