4.1 鸭子类型和多态

慕课网课程:Python高级编程和异步IO并发编程

C++中如何实现多态:

class Mammal
{
public:
    virtual void Speak() const {std::cout<<"Mammal speak!";}
}

class Dog:public Mammal
{
public:
    void Speak() const {std::cout<<"Woof";}
}

class Cat:public Mammal
{
public:
    void Speak() const {std::cout<<"Meow";}
}

int main()
{
    Mammal *ptr = new Cat;
    ptr->Speak()
    ptr = new Cat;
    ptr->Speak()
}

从上可知,需要定义一个父类Mammal, 子类继承Mammal,这是因为C++是静态语言,当定义一个变量ptr时,需要指定一个类型。而Python是动态语言,不需要定义父类即可实现多态

class Cat(object):
    def say(self):
        print('i am a cat')

class Dog(object):
    def say(self):
        print('i am a dog')

class Duck(object):
    def say(self):
        print('i am a duck')

animal_list=[Cat, Dog, Duck]
for animal in animal_list:
    animal().say()

鸭子类型:When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.
当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。

name_list=['bobby1', 'bobby2']
name_list2=['bobby3', 'bobby4']
name_tuple = ('bobby5', 'bobby6')
name_set=set()
name_set.add('bobby7')
name_set.add('bobby8')

extend函数接收的参数是iterable, 也就是说它接收的参数不限定具体类型,只要是可迭代的都可以,这就是鸭子类型的概念
name_list.extend(name_list2)    # ['bobby1', 'bobby2', 'bobby3', 'bobby4']
name_list.extend(name_tuple)    # ['bobby1', 'bobby2', 'bobby5', 'bobby6']
name_list.extend(name_set)      # ['bobby1', 'bobby2', 'bobby7', 'bobby8']

猜你喜欢

转载自blog.csdn.net/shfscut/article/details/80255545