Python中的抽象类、多态和鸭子类型都是实现代码灵活性的机制,但它们之间还是有一些区别的。
为了在不知道对象具体类型的情况下,统一对象调用方法的规范(名字)
父类: 定制一套统一的规范。(比如: 方法名统一)
子类: 遵循父类的统一的规范。(比如: 子类遵循父类方法名的统一)
func(people1)
func(people1)
去调用class People(Animal): #属于动物的另外一种形态:人
def speak(self):
print('say hi')
def func(people): #对于使用者来说,自己的代码根本无需改动
people.speak()
people1=People() #实例出一个人
func(people1) #甚至连调用方式也无需改变,就能调用人的talk功能
'''
这样我们新增了一个形态People,由People类产生的实例people1,使用者可以在完全不需要修改自己代码的情况下,
使用和猫、狗、猪一样的方式调用people1的speak方法,即func(people1)
'''
示例代码二
class Shape:
def area(self):
pass
class Square(Shape):
def __init__(self, side):
self.side = side
def area(self):
return self.side ** 2
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14 * self.radius ** 2
def print_area(shape):
print(shape.area())
s = Square(5)
c = Circle(3)
print_area(s) # 25
print_area(c) # 28.26
在上述代码中,Shape
类是一个基类,定义了一个方法area()
。Square
和Circle
类继承了Shape
类,并分别实现了自己的area()
方法。print_area()
函数接受一个Shape
类型的参数,不同类型的Shape
对象会产生不同的行为,实现了多态。
在python内置的abc模块中,有一个抽象类,让子类必须遵循父类的编写规范。
注意:
在python中不推荐使用抽象类。
子类必须按照父类的方法编写规范,缺一不可。(只要父类中有几个抽象方法,子类就必须要定义几个,可以多,但不能少)
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area(self):
pass
class Square(Shape):
def __init__(self, side):
self.side = side
def area(self):
return self.side ** 2
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14 * self.radius ** 2
# 不能实例化Shape
# s = Shape()
sq = Square(5)
c = Circle(3)
print(sq.area()) # 25
print(c.area()) # 28.26
在上述代码中,Shape
类是一个抽象类,定义了一个抽象方法area()
。Square
和Circle
类继承了Shape
类,并分别实现了自己的area()方法。由于Shape
是抽象类,不能直接实例化,只能通过子类进行实例化。
不同对象,先抽象出相同类型的方法,给他们定制一套统一的规范。所有的类,在定义时都按照统一的规范进行编写。
class Duck:
def quack(self):
print("Quack")
class Person:
def quack(self):
print("I'm quacking like a duck")
def duck_test(obj):
obj.quack()
d = Duck()
p = Person()
duck_test(d) # Quack
duck_test(p) # I'm quacking like a duck
在上述代码中,Duck
和Person
类都有一个quack()
方法,duck_test()
函数接受一个对象参数,只要该对象有quack()
方法即可,不关心其具体类型,实现了鸭子类型。
以上就是关于Python -【多态,抽象类,鸭子类型】的区别及使用介绍,希望对你有所帮助!