Python鸭子类型和多态

版权声明:转载 或者复制请标注来源 https://blog.csdn.net/qq_34979346/article/details/83144141

先看看代码,稍后我再分析

class Person:
    def run(self):
        print("Person can run")
class Animal:
    def run(self):
        print("Animal can run")
class Robot:
    def run(self):
        print("Robot can run")

for i in [Person,Animal,Robot]:
    i().run()

打印的结果;

Person can run
Animal can run
Robot can run
  1. 大家要理解 为什么 可以 这样写a=Person, 类 函数可以作为对象, 之前文章有介绍过.

  2. python 的变量是没有指定类型的, 拿来就直接赋类型就行了, 这就是 和静态语言java 的区别. 缺点是不运行是不知道有问题的.

  3. [Person,Animal,Robot] 这个三个类一定要有同样的方法 run, 才能实现 ,这就是 鸭子类型的概念

  4. “当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。” 实际他是不关心你是不是鸭子,我只看你会不会像鸭子走路, 叫,游泳. 都会归为一类. 都可以调用共同的方法,或者属性.

  5. 如果对这个例子不太理解我再举个简单例子 如下

a=['Andy','Xiuwu','Maggie']
name_tuple=['Andy01','Xiuwu01','Maggie01']
name_set=set()

name_set.add("Andy3")
name_set.add("Xiuwu3")

a.extend(name_tuple)
print(a)


#注意 extend 语法是  def extend(self, iterable):    iterable 要是可迭代类型. 可没有说 只是list 类型# ,是个总的类型要求可迭代. 所以思维要扩散.
# iterable  隐藏调用了 __iter__  和 __getitem__, 魔法函数, 所以魔法函数会改变对象的类型,这个要切记, 下边我在举个例子吧.

class Person:
    def __init__(self,person_list):
        self.person_list=person_list
    def __getitem__(self, item):
        return self.person_list[item]

#下边我们就可以用 这个 迭代类型对象  看好了

name_tuple.extend(Person(a)) 
#说明 Person(a)这个是可迭代了类型, 由于类Person 调用了 getitem 魔法函数 导致的.  

打印的结果如下 :

['Andy', 'Xiuwu', 'Maggie', 'Andy01', 'Xiuwu01', 'Maggie01']
['Andy01', 'Xiuwu01', 'Maggie01', 'Andy', 'Xiuwu', 'Maggie', 'Andy01', 'Xiuwu01', 'Maggie01']

猜你喜欢

转载自blog.csdn.net/qq_34979346/article/details/83144141