首页
学习
活动
专区
工具
TVP
发布

Python3(8)Python 面向对象高级编程

本系列主要学习Python的基本使用和语法知识,后续可能会围绕着AI学习展开。

Python3 (1) Python语言的简介

Python3 (2) Python语法基础

Python3 (3) Python函数

Python3 (4) Python高级特性

Python3(5) Python 函数式编程

Python3(6) Python 模块

Python3(7) Python 面向对象编程

Python3(8) Python 面向对象高级编程

Python面向对象编程有他自己强大的一面,如“鸭子类型”,这是动态语言独有的特性,上一篇的面向对象基础讲了python与其它语言面向对象的共同之处,这一篇主要讲Python中特有的面向对象特性。重继承、定制类、元类等,这一篇应该算是Python学习当中的中级核心篇。

动态的添加类的属性方法

面向对象中,对象是类的实例,集类的属性和方法于一体,由于python是动态语言,在运行时才创建类,所以python 有动态添加类属性与对象属性的能力。这一下就将静态语言比下去了,如下:

输出结果:

动态添加类的属性、方法,每个对象都可以用

动态添加对象的属性、方法,只有当前对象可以用

暴露出动态语言一个缺点,可以肆意的添加方法,属性,对于严格安全性要求严格的业务明显不行,所以有一个特殊的标识出现了来限定添加的属性。

__slots__ 的用法

在类中,用赋值一个 ,中的属性为可以添加的属性。

输出结果:

上面的错误信息就是不允许添加 属性。

在子类中,如果使用了就是子类+父类的限制,如果没有使用父类的限制对子类没用。

输出结果:

如果放开就会报错,只支持操作。

@property 的用法

的作用就是为变量生成一个装饰器,用于把一个方法变成属性调用的。为了限制属性的赋值,解决属性赋值的随意性。

输出结果:

如果将整数赋值给 会抛出我们定义的异常,这样就达到限制必须类型的作用。使我们的属性可控起来。用起来立马感觉代码优美多了,减低了出错的可能。

多重继承

python与C++一样,支持多重继承,其实与java 中接口与继承一起用的效果差不多。Python 中称接口的设计为 。

MixIn

的设计与接口一样,通过组合搭配来构成一个新的完整的功能,而不是层层继承来实现。我们来分析一下Python 自带的TCPServer和UDPServer这两类网络服务。

Python中一些功能性的类命名,所以我们在书写的时候也采用这种方式,主类采用当继承的方式,一些功能性用多继承,功能性的类命名采用的形式。

定制类

我们通过Python中内置的一些特殊标识去定制一些类

__str__ 和__repr__

用于定义打印的类本身的内容,用户反馈,也是打印类本身的内容,开发者反馈。也就是通过命令运行时的显示。

输出结果:

我们演示了的使用,但是需要命令执行,所以可以自己试试。

__iter__

用于将类变成一个迭代对象。一般要与一起使用,接下来我们定义一个可迭代的类

输出结果:

输出的是1~50之间的斐波那契数列,这样我们定制了一个可以循环的类,与Python中内置的、相似但是还有不同的,比如通过索引查找元素,切片技术都是不行的,下面我们下一个标识就是改进这个的。

__getitem__

的作用就是设置下标对应的元素的,也可以实现切片 要进行判断,我们一步到位:

输出结果:

这个就使我们定义的Fib有了list的部分功能。这就是鸭子类型的应用,我们可以定义我们需要的任何类,包括实现系统内置的一些类,简单一句就是可以 “以假乱真”。

__getattr__

的作用是调用类的方法或属性时,如果没有的话会走的方法。如果没有方法就会报错。所以非常好用,我们可以根据这个特性设计好多灵活的东西,比如灵活的拼接调用链接:

输出结果:

上面实现了一个动态的生成一个连接,我们采用的链试调用,第一次我们创建的的实例,的值被赋值为,第二次调用,不存在,所以进了方法,通过拼接的值变成,……调用的时候,方法被调用,所以把对应的拼接上,最后一个动态的链接就生成了。

刚开始我也有点闷逼,主要是没有理解的作用,还有就是链试调用也没看明白导致的。最后通过断点和打印每一步的数据看懂了。终于从牛角尖里出来了。

__call__

的作用是把一个对象变成一个可调用的函数,其实函数和对象没有什么界限,因为在python中一切都是对象。换句话说如果我们类中定义了函数,他的实例就是可以被直接调用的。

输出结果:

我们直接将对象当做函数来使用。其实还有一个函数来判断一个对象是否可以被直接调用

···

print(callable(p))

···

输出结果:

枚举类

枚举跟java一样,也是规范代码的写法。保证代码更加清晰,规范

输出结果:

以上就是枚举的定义和使用,规范了值的具体含义,不会出现歧义。

type() 的高级用法

首先我们再次强调Python是动态语言,强大之处不是编译时生成类,而是在运行时。然后再来看之前用他来判断类的类型,现在我们学习他的高级用法,既然他放回的是类型,所以我们可以用它动态的创建类。这个就非常牛逼了,没有在java等静态语言中听说过的用法。

输出结果:

看到没类就是动态的通过创建的。的三个参数:

class的名称;

继承的父类集合,注意Python支持多重继承,如果只有一个父类,别忘了tuple的单元素写法;

class的方法名称与函数绑定,这里我们把函数fn绑定到方法名name上。

元类(metaclass)

的作用是控制类的创建行为。因为既然能创建类,我们不能让它没有规矩的创建,我们应该通过来做一些修改。我们要给类定规则,所以要先定义 ,然后创建类。

先定义,就可以创建类,最后创建实例

允许你创建类或者修改类,相当于类是 创建出来的实例

我们一般通过 +来命名

接下来我们给添加一个 方法:

输出结果:

就是我们定义的具有方法的类,我们来看看的定义,是不是主要看有没有标识的函数。参数的意义:

1. 当前准备创建的类的对象;

2. 类的名字;

3. 类继承的父类集合;

4. 类的方法集合。

动态的修改要创建的类,在特定的情况下会使用到,例如: 即对象-关系映射 ,也就是可以设计框架,下一讲我们学习一下编写的框架的原理。

参考

https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143186738532805c392f2cc09446caf3236c34e3f980f000

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180126A13C0800?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券