面向对象知识的整理
面向对象在Python中占有很重要的分量,如果不理解面向对象的相关内容,那么对后面的学习就会犯糊涂。当初开始学习的时候总感觉面向对象很难理解,可能当初选择的书籍不太正确(当初直接看《Python学习手册》,原以为厚的书都是讲得比较清楚的,但是后来才发现里面的知识结构挺混乱的而且有很多知识点重复,显得有点啰嗦,重点不突出,导致学得很糊涂,所以建议新手不要选择这本书作为入门书籍!),但是在掌握一定知识再看这本书反而收益很多,特别是28章的内容,以例子的形式讲解了类的实际过程,里面的设计更加多的体现了代码的可维护性,真是收益良多!不过看这本书还是有相关的面向对象知识,才可以很好的掌握这本书中有关面向对象的知识和原理!如下是整理一些博客的内容,人家已经整理的很好了,我也算是“马后炮”了,加上一些自己的东西!
现在各种编程语言的编程范式基本是分两类,一是面向对象,二是面向过程。一般人对于面向过程的即使基本都是以流程为执行过程,以将大问题变成小问题为设计思路的来解释,但是面向过程的缺点对比于面向对象而言就显而易见了,面向对象不利于后期的维护。当你要对程序进行修改,那意味着对你修改的那部分有依赖的各个部分你都也要跟着修改。但是如果你只是去做某些一次性任务的时候,用面向过程的方式是极好的,但对于你要处理的是复杂的任务,且需要不断迭代和维护 的, 那还是用面向对象最方便。那面向对象的的好处是什么?首先程序的维护和扩展变得更简单,代码的重用性更佳,并且可以大幅度地提高程序开发效率,另外,基于面向对象的程序可以使它人更加容易理解你的代码逻辑。 相比于面向过程而言,面向对象在设计的时候在某种程度上地减低了数据的出错率!
在Python中面向对象的三大特性:继承,多态,封装!其中多态就是常说中Python的“鸭子类型”语言,而封装就是类中包含着数据和方法,创建对象直接调用内种类中的方法就可以了。还要注意一点的就是,多态允许将子类的对象当作父类的对象使用,某父类型的引用指向其子类型的对象,调用的方法是该子类型的方法。这里引用和调用方法的代码编译前就已经决定了,而引用所指向的对象可以在运行期间动态绑定。面向对象核心的问题:数据的存储问题,数据的空间分布,数据的传递问题(引用)!
明白Python的类要注意这以下问题:
- 当你实例化时python会自动把这个实例本身通过self参数传进去(对象指针的形式),相当于这个参数已经该出了。__init__(self,xxx)方法,相当于类.__init__(实例化对象,xxx)
- __init__()叫做初始化方法(或构造方法),在类被调用时,这个方法(虽然它是函数形式,但在类中就不叫函数了,叫方法)会自动执行,进行一些初始化的动作。总结:其实上述就是封装,其实就是使用构造方法将内容封装到某个具体对象中,然后通过对象直接或者self间接获取被封装的内容。
- 继承概念的实现方式主要有2类:实现继承和接口继承。
- 实现继承是指使用基类的属性和方法而无需额外编码的能力;
- 接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力(子类重构爹类方法);
- 所以OO开发范式大致为:划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实 例进行设计和实现几个阶段。
面向对象类中由于不同的版本导致了不同类的继承收索,而最直接的影响就是类的类型了,当然这里的跟家值得注意的是类的一些特性也随着改变如特性,多继承等等!两者的不同(经典类:深度优先和新式类:广度优先。)
类的一些重要知识:成员、成员修饰符、特殊成员等!
类成员包括字段、方法、属性,如下一一简要介绍。
字段:
字段主要分为普通字段和静态字段,两者的访问方式不同,静态字段属于类,普通字段属于对象(self), 最本质的区别是内存中保存的位置不同,因而普通字段在每一个对象都要创建一份,而静态字段就是在内存中保存着一份,只是通过对象指针引用就可以了!应使用思路: 通过类创建对象时,如果每个对象都具有相同的字段,那么就使用静态字段。但是要通过类才可以访问的而不是对象进行访问!
方法:
- 方法:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。
- 普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self;
- 类方法:由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类复制给cls;
- 静态方法:由类调用;无默认参数;
相同点:对于所有的方法而言,均属于类(非对象)中,所以,在内存中也只保存一份。
不同点:方法调用者不同、调用方法时自动传入的参数不同。
属性:
定义时,在普通方法的基础上添加 @property 装饰器;
定义时,属性仅有一个self参数
调用时,无需括号
其中注意:
属性存在意义是:访问属性时可以制造出和访问字段完全相同的假象
属性由方法变种而来,如果Python中没有属性,方法完全可以代替其功能。
属性的定义有两种方式:
装饰器 即:在方法上应用装饰器
装饰器方式:在类的普通方法上应用@property装饰器
这里要分为两种一种是新式类一种是经典类(只有一种方法)。
新式类的好处:
- 新式类中的属性有三种访问方式,并分别对应了三个被@property、@方法名.setter、@方法名.deleter修饰的方法。
- 由于新式类中具有三种访问方式,我们可以根据他们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除。
静态字段 即:在类中定义值为property对象的静态字段(没有经典类和新式类的区分)
property的构造方法中有个四个参数:
- 第一个参数是方法名,调用 对象.属性 时自动触发执行方法
- 第二个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法
- 第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法
- 第四个参数是字符串,调用 对象.属性.__doc__ ,此参数是该属性的描述信息
成员修饰符:
每一个类的成员都有两种形式:
- 公有成员,在任何地方都能访问
- 私有成员,只有在类的内部才能方法
私有成员和公有成员的访问限制不同:
静态字段
- 公有静态字段:类可以访问;类内部可以访问;派生类中可以访问
- 私有静态字段:仅类内部可以访问;
普通字段
- 公有普通字段:对象可以访问;类内部可以访问;派生类中可以访问;
- 私有普通字段:仅类内部可以访问;
总结一句话,私有成员只能够在类的内部进行访问方法同样原理!!
特殊成员特殊成员:
__del__、__call__、 __str__、__getitem__、__setitem__、__delitem__、__getslice__、__setslice__、__delslice__、__iter__、__dict__(__dict__静态字段和方法)
类的检查方法如下:
isinstance(obj, cls)
检查是否obj是否是类 cls 的对象
class Foo(object): pass obj = Foo() isinstance(obj, Foo)
issubclass(sub, super)
检查sub类是否是 super 类的派生类
1 class Foo(object): 2 3 pass 4 5 6 7 class Bar(Foo): 8 9 pass 10 11 12 13 issubclass(Bar, Foo)