python 鸭子类型及三大特性

枫铃3年前 (2021-07-10)Python227

python 中一切皆对象。

先说 说面向对象语言三大特性:封装、继承、多态。

1、封装分两个层面
第一层面:创建类和对象时,分别创建两人者的名称空间,只能通过类名加"."或者obj.的方式访问里面的属性方法;

第二层面:类中可以把某些属性或方法隐藏起来,或者定义为私有,只在类内部使用,在类的外面无法访问,或者只留下少量的接口(函数)供外部访问。

2、继承
python中可以多继承,其继承顺序使用了C3算法,可以通过 类.__ mro__ 来查看

mro: method resolution order (方法解释顺序)

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class A(object):
    def say(self):
        print('AA say')

class B(object):
    def say(self):
        print('BB say')

class C(A):
    def say(self):
        print('CC say')

class D(B):
    def say(self):
        print('DD say')

class E(D, C):
    def say(self):
        print('EE say')


d = E()
print(E.__mro__)
d.say()

输出如下:

(<class '__main__.E'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
EE say

这里只是展示怎么查看多继承的查找顺序,关于继承的复杂结构还有很多,这里就不一一列了,结构不一样,继承的顺序也不一样,有的广度优先有的深度优先,自己试吧。

继承的顺序算法比较复杂,强烈不推荐使用这种多继承的方式,要不然会很混乱。推荐使用Mixin的多继承方式,即所继承的每个类中只实现了同一种方法,不存在多方覆盖的问题。不过若是真的设计成了多继承的复杂结构,调试代码时还是尽量使用mro来查看一下到底执行了哪个父类中的属性方法。

3、多态

python不支持多态,或者说python本来就是多态语言。

鸭子类型:

Duck typing 这个概念来源于美国印第安纳州的诗人詹姆斯·惠特科姆·莱利(James Whitcomb Riley,1849-
1916)的诗句:”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.”
上代码,来源于网上很经典的案例:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Duck():
    def walk(self):
        print("I walk like a duck")
    def swim(self):
        print('I swim like a duck')

class Person():
    def walk(self):
        print("I walk like a duck")
    def swim(self):
        print('I swim like a duck')

可以看出Pseron类拥有和Duck类一样的方法,当程序调用Duck类,并利用了其中的walk和swim方法时,我们传入Person类也一样可以运行,程序并不会检查类型是不是Duck,只要他拥有 walk()和swim()方法,就能被正确地调用。

举例:

一个对象实现了__ getitem__魔法方法,那python解释器就会把它当做一个callection,你就可以对这个对象进行切片、获取子项等; 如果一个对象实现了__ iter__和next方法,python就会把它当成一个iterator, 你就可以对这个对象通过循环获取各个子项; 如果一个对象中实现了__ len__方法,你就可以对这个对象执行len()对它进行计数。

结论:

面向对象是很强大的,在python编程之初我们要强制自己不要什么都用函数来实现,要多写类,即使是很小的功能实现也用类来做,养成习惯,久了以后关于类和对象的相关知识自然接触的就多,也能写出更加复杂的程序。

相关文章

利用python同步windows和linux文件

写python脚本的初衷,每次在windows编辑完文件后,想同步到linux上去,只能够登录服务器,...

爬虫基本原理

爬虫基本原理 一、爬虫是什么? 百度百科和维基百科对网络爬虫的定义:简单来说爬虫就是抓取目标网站内容的工具,一般是根据定义的行...

Django 函数和方法的区别

函数和方法的区别 1、函数要手动传self,方法不用传 2、如果是一个函数,用类名去调用,如果是一个方法...

Django 知识补漏单例模式

单例模式:(说白了就是)创建一个类的实例。在 Python 中,我们可以用多种方法来实现单例模式&#x...

Django基础知识MTV

Django简介 Django是使用Python编写的一个开源Web框架。可以用它来快速搭建一个高性能的网站。 Django也是一个MVC框架。但是在Dj...

Python mysql 索引原理与慢查询优化

一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。