可以通過普通類實現接口,但是並沒有起到規範作用,繼承者可以選擇實現或不實現
# 普通類定義接口
# class Animal(object):
# def say(self):
# pass
# def eat(self):
# pass
通過abc
模塊來創建,類似於java
中的abstract class
# 通過`abc`模塊來創建
# import abc
# class Animal(metaclass=abc.ABCMeta):
# @abc.abstractmethod
# def say(self):
# pass
# def eat(self):
# print("eat food")
# # a = Animal() # 抽象類不能被實例化
# class Dog(Animal):
# def say(self):
# print("dog")
# dog = Dog()
# dog.say()
# dog.eat()
類似於java中的interface
# 接口,所有方法都是抽象方法的抽象類
import abc
class Person(metaclass = abc.ABCMeta):
@abc.abstractmethod
def say(self):
pass
@abc.abstractmethod
def eat(self):
pass
class Teacher(Person):
def say(self):
print("teacher")
def eat(self):
print("shitang")
teacher = Teacher()
teacher.say()
teacher.eat()
比較點 | 普通類 | 抽象類 | 接口 |
---|---|---|---|
實例化 | yes | no(只有子類可以,需要子類實現所有父類的抽象方法,否則子類必須還是抽象類) | no(只有子類可以,需子類實現所有接口方法) |
方法聲明和實現 | 只能實現 | 可以聲明和實現 | 只能聲明 |
是否全部實現 | 無關 | 如果不全部實現,則子類仍是抽象類 | 如果不能全部實現,子類必須是抽象類 |
是否有抽象方法 | 無關 | 有一個抽象方法既是抽象類,可以無抽象方法 | 必須有抽象方法 |
繼承 | 無關 | 只能單繼承(extend) | 可以多繼承(interface) |
參考:
https://www.cnblogs.com/leeego-123/p/11378108.html