慕课网课程: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']