在像 python 这样的 OOP 语言上,从接口到类型和抽象 class 的实际区别是什么?
Whats is the practical difference from a Interface to a type and to an abstract class on OOP languages like python?
在 python 等 OOP 语言中,从接口到类型和抽象 class 的实际区别是什么?
指向维基百科的链接看起来一样
Interface, type and abstract class
Python 有 duck typing :
If it walks like a duck and it quacks like a duck, then it must be a duck
这意味着这行得通:
class Duck:
def quack(self):
print("quack!")
class Car:
def quack(self):
print("vroum!") # for example purposes
def make_it_quack(something):
something.quack() # don't care what it is, just that it quacks
make_it_quack(Duck()) # quack!
make_it_quack(Car()) # vroum!
Python 在运行时会尝试调用对象的 quack
方法,如果不存在则失败。但是只要方法存在(并且签名合适),Python 就不会关心对象的实际类型。
在其他语言中,您可能需要定义两个子 class 都必须继承的基础 class(可能 抽象 )。如果您希望您的对象具有多组不同的方法,您 1) 可以进行多重继承,2) 您可以构建(抽象)基础 classes 或 3) 的高层次结构,您会创建很多接口。 Python 不需要任何这些,但它不会为您提供代码类型检查的静态保证。
如果需要,Python 中有一些方法可以进行更多类型检查:
TL;DR : Python 是鸭子类型的,但如果您想要接口契约附带的保证,可以使用工具。
看书design patterns GoF他们解释说接口是shell方法公开可用,类型是数据的内部结构,抽象class可以是这样的形式当脚本构建一个看起来像类型的对象时,将基于数据。
在 python 等 OOP 语言中,从接口到类型和抽象 class 的实际区别是什么?
指向维基百科的链接看起来一样 Interface, type and abstract class
Python 有 duck typing :
If it walks like a duck and it quacks like a duck, then it must be a duck
这意味着这行得通:
class Duck:
def quack(self):
print("quack!")
class Car:
def quack(self):
print("vroum!") # for example purposes
def make_it_quack(something):
something.quack() # don't care what it is, just that it quacks
make_it_quack(Duck()) # quack!
make_it_quack(Car()) # vroum!
Python 在运行时会尝试调用对象的 quack
方法,如果不存在则失败。但是只要方法存在(并且签名合适),Python 就不会关心对象的实际类型。
在其他语言中,您可能需要定义两个子 class 都必须继承的基础 class(可能 抽象 )。如果您希望您的对象具有多组不同的方法,您 1) 可以进行多重继承,2) 您可以构建(抽象)基础 classes 或 3) 的高层次结构,您会创建很多接口。 Python 不需要任何这些,但它不会为您提供代码类型检查的静态保证。
如果需要,Python 中有一些方法可以进行更多类型检查:
TL;DR : Python 是鸭子类型的,但如果您想要接口契约附带的保证,可以使用工具。
看书design patterns GoF他们解释说接口是shell方法公开可用,类型是数据的内部结构,抽象class可以是这样的形式当脚本构建一个看起来像类型的对象时,将基于数据。