Python——多态与鸭子类型

多态

1 什么是多态

  • 同一种事物有多种形态

2 为何要有多态=>多态会带来特性,多态性

# 多态性指的是可以在不考虑对象具体类型的情况下而直接使用对象
class Animal:  # 统一所有子类的方法
    def say(self):
        print('动物基本的发声频率...', end=' ')

class People(Animal):
    def say(self):
        print('啊!!!!!!!')

class Dog(Animal):
    def say(self):
        print('汪汪汪')

# 多态性的好处在于增强了程序的灵活性和可扩展性,
# 比如通过继承Animal类创建了一个新的类,实例化得到的对象obj,可以使用相同的方式使用obj.talk()
people=People()
dog=Dog()

people.say()
dog.say()


# 定义统一的接口,接收传入的动物对象
def animal_say(animal):
    animal.say()

animal_say(obj1)
animal_say(obj2)
animal_say(obj3)


# len()
len('hello')
len([1,2,3])
len({'a':1,'b':2})

print('hello'.__len__())
print([1,2,3].__len__())
print({'a':1,'b':2}.__len__())

def my_len(val):
    return val.__len__()

print(my_len('hello'))
print(my_len([1,2,3]))
print(my_len({'a':1,'b':2}))


# 了解:
# 多态性的本质在于不同的类中定义有相同的方法名,我们可以在不考虑类的前提下统一使用一种方式去使用对象
# 但也会有一个问题,那就是子类没有与父类相同的方法名时也能够使用,针对这种情况,我们可以引入abc模块
# 给父类设置一个抽象类的概念来限制子类必须要有与父类相同的方法才能够被实例化否则将抛出异常
import abc

# 指定metaclass属性将类设置为抽象类,抽象类本身只是用来约束子类的,不能被实例化
class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod # 该装饰器限制子类必须定义有一个名为talk的方法
    def talk(self): # 抽象方法中无需实现具体的功能
        pass

class Cat(Animal): # 但凡继承Animal的子类都必须遵循Animal规定的标准
    def talk(self):
        pass

cat=Cat() # 若子类中没有一个名为talk的方法则会抛出异常TypeError,无法实例化

鸭子类型

什么是鸭子类型

  • 完全可以不依赖于继承,只需要制造出外观和行为相同对象,同样可以实现不考虑对象类型而使用对象
  • Python崇尚的“鸭子类型”
# 比起继承的方式,鸭子类型在某种程度上实现了程序的松耦合度
# linux中所有的操作都是对文件的操作
# 二者看起来都像文件,因而就可以当文件一样去用,然而它们并没有直接的关系
class CPU: #CPU类有两个与文件类型同名的方法,即read和write
    def read(self):
        pass
    def write(self):
        pass

class Disk: #Disk类也有两个与文件类型同名的方法:read和write
    def read(self):
        pass
    def write(self):
        pass

猜你喜欢

转载自www.cnblogs.com/guanxiying/p/12672974.html