1. 程式人生 > >07---多態與多態性

07---多態與多態性

對象 序列類型 cat 活性 自己的 可擴展性 走起 多態 fun

多態與多態性

多態

  • 多態:一種事物的多種形態,比如:動物有多種形態,人、狗、貓。
import abc


class Animal(metaclass=abc.ABCMeta):  # 同一類事物:動物
    @abc.abstractmethod
    def run(self):
        pass

    @abc.abstractmethod
    def eat(self):
        pass


class Person(Animal):                 # 動物形態之一:人
    def run(self):
        print('在走')

    def eat(self):
        print('人吃飯')


class Pig(Animal):                    # 動物形態之一:豬
    def run(self):
        print('在跑')

    def eat(self):
        print('豬吃草')


class Dog(Animal):                    # 動物形態之一:狗
    def run(self):
        print('在跳')

    def eat(self):
        print('小狗吃肉')


class Cat(Animal):                    # 動物形態之一:貓
    def run(self):
        pass

    def eat(self):
        pass

多態性

  • python本身就是支持多態性的。不考慮實例對象的類型,比如說python的 + ,字符串能相加。數字能相加,列表能相加。但是他們是不同的對象;還有len()。字符串有長度。列表有。元祖有,字典等都有。
  • 靜態多態性、動態多態性。
  • 不管對象是什麽類型。只要他實現了某個方法就行。
import abc


class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def run(self):
        pass

    @abc.abstractmethod
    def eat(self):
        pass


class Person(Animal):
    def run(self):
        print('在走')

    def eat(self):
        print('人吃飯')


class Pig(Animal):
    def run(self):
        print('在跑')

    def eat(self):
        print('豬吃草')


class Dog(Animal):
    def run(self):
        print('在跳')

    def eat(self):
        print('小狗吃肉')


class Cat(Animal):
    def run(self):
        pass

    def eat(self):
        pass
class Phone:
    def eat(self):
        print('我是手機對象,吃不得')

person1 = Person()
pig1 = Pig()
dog1 = Dog()
p = Phone()

# 統一的接口
def func(animal):
    animal.eat()


func(person1)
func(pig1)
func(dog1)
func(p)
'''
人吃飯
豬吃草
小狗吃肉
我是手機對象,吃不得
'''
  • 對於animal來說。它是func的一個參數,而卻代表著多種形態,動物。人。貓。狗。手機。
  • 為什麽要使用多態性?
    • 增加量程序的靈活性。以不變應萬變,不論對象千變萬變,使用者都是通過接口func(animal)去調用
    • 增加量程序的可擴展性。新建的類Phone。只要他下面有eat方法,使用者可以完全不修改自己的代碼,和動物類一樣調用eat()方法。

鴨子類型

  • 如果看起來像鴨子,走起來像鴨子,叫起來像鴨子,那它就是鴨子。
  • 序列類型有多種形態:字符串,列表,元組,但他們直接沒有直接的繼承關系
# 序列類型:列表list  元祖tuple  字符串str

l = list([1,2,3])
t = tuple(('a','b'))
s = str('hello python')

def len(obj):
    return obj.__len__()

print(len(l))
print(len(t))
print(len(s))

07---多態與多態性