本系列主要学习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
领取专属 10元无门槛券
私享最新 技术干货