python--更加抽象(对象)
一、对象:可以看做数据以及由一系列可以存取,操作这些数据的方法所组成的集合。
对象的特点:多态,封装,继承。
1、多态:可以对不同类的对象使用同样的操作。不需要理解对象的具体类型,也能对它进行操作。
方法:绑定到对象特性上面的函数。
多态的多种形式:
2、封装:指向程序中的其他部分隐藏对象的具体实现的细节的原则。
封装与多态的区别:封装:不用关心对象是如何构建的而直接进行使用。多态:对于不知道是什么类的对象进行方法调用。
对象由它自己的状态,对象的状态是由它的特性(比如名字)来描述。对象的方法可以改变特性。
3、继承:已经存在一个类,现在又想建立一个非常类似的类。例如新的类只是添加几个方法。可以通过继承。
例如已经有个Shape类,可以用来在屏幕上画出指定的形状,但现在需要创建一个Rectangle类不仅可以画图还可以计算面积。
二、类和类型:
1、创建类:
程序运行结果:
self:是对对象自身的引用,例如上述代码,调用foo的setName和greet函数时,foo自动将自己作为第一个参数传递给函数。如果没有的话成员方法就没法访问他们要对其特性进行操作的对象本身了。
特性是可以在外部访问的:
2、特性,函数和方法:
特性是对象内部的变量。
对象的状态由它的特性来描述,对象的方法可以改变它的特性。
可以直接从对象外部访问特性。
程序运行结果:
a.name:直接从外部访问特性。a.name='mao yang':直接从外部改变特性。
2、私有化:使外部无法访问特性或方法,内部任可调用。只要在名字前面加上双下划线即可。
程序运行结果:
b.__secret:外部无法调用,但类内部还能使用。
实际上还是可以在类的外部访问私有方法:
3、类的命名空间:所有位于class语句中的代码都在类的命名空间内执行。
init:初始化所有实例。
如下代码:实现了计算成员数量。
代码运行结果:
重绑members特性:
4、指定超类:
如下代码:超类Filter是过滤序列中的通用类,事实上它不能过滤任何东西。SAMP类继承了Filter用于过滤序列中的SPAM。
程序运行结果:
5、检查继承:
1、issubclass函数:检查一个类是否是另一个类的子类。
2、__bases__:查找已知类的基类。
3、isinstance方法检查一个对象是否是一个类的实例。
s不仅是子类SPAM的实例,也是Filter父类的实例。
4、查找一个对象输入哪个类,__class__特性。
6、多个超类:
编写一个会说话的计算器:
如下代码TalkingCalculator类什么事情都没做,继承了Calculator,Talker类的calculator,talk方法。被称为多重继承。
注意:一个方法从多个超类中继承,则先继承类的方法会重写后继承类的方法。
程序运行结果:
7、接口:
接口的概念:与多态有关,在处理多态对象时,只需要关心它的接口即可。也就是公开的一些方法和特性。
1、hasattr:检查对象是否包含特性。
2、getattr函数:允许提供默认值,以便在特性不存在的时使用,callable函数。如下代码就使用了None。
3、setattr函数:设置对象的特性。
4、__dict__特性:查看对象内所有存储的值。
二、总结:
1、对象:包括特性和方法。特性是作为对象的一部分变量,方法则是存储在对象内的函数。方法和其他函数的区别在于,方法总是将对象作为第一个参数,这个参数称为self。
2、类:代表所有对象的集合。每个对象都有一个类。类的主要任务是定义它的实例会用到哪些方法。