Python之路【第四篇】:面向对象
基本概念
*面向对象是为了给(类)代码分级,方便了代码管理。和省市区分级是一样的概念。
*类:对象的模板。
*对象:类的实例。
*继承:子类使用上级类的属性。
*封装:父类不让下级类共享的属性。
*消息传递:不同对象进行消息的互动。
*多态:一个函数在父类和子类的名字相同,参数、类型、函数体可能不同。
*抽象:不同对象的共同属性抽象出来定义一个父类(模板)。
其它概念
*实例化对象的参数传给类的__init__方法。
* self(是实例不是类):
1.为了实现类函数数据共享;类函数与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候你不为这个参数赋值,Python会提供这个值。这个特别的变量指对象本身,按照惯例它的名称是self。
2.如你有一个类称为MyClass和这个类的一个实例MyObject。当你调用这个对象的方法MyObject.method(arg1, arg2)的时候,这会由Python自动转为MyClass.method(MyObject, arg1, arg2)
*类函数和类变量处于同级,因此类函数不能直接调用类变量,要用“self.类变量”才能调用,要直接调用要用” 类.类变量”,但调用的是类的内存对象,类外也可以调用” 类.类变量”。
(因为实例化后,类变量=对象.类变量,其它类函数的self=对象)
*私有属性只能在类内部被调用,可以封装在类函数里来读取,这就实现了属性封装即外部(包括子类)不能修改只能读取。实际外部也可以换一种方式调用,实例._类__私有属性。
*构造函数__init__在实例化后自动执行,用于初始化;解构函数__del__在实例释放后自动执行。
*继承:子类也会继承父类的构造函数,如果重写会覆盖父类的,要用父类构造函数,子类构造函数内要手动调用父类构造函数。(其它函数也同理)
*实例赋值给变量,该变量可传入类函数作为参数。
*多态:Pyhon不支持多态并且也用不到多态,多态的概念是应用于Java和C#这一类强类型语言中。
*装饰器:可以装饰类和函数,在不改变源代码和调用方式的前提下对函数或类进行功能的扩展。
*新式类与旧式类区别:
1.新式类Class(object)兼容旧式类,新式类可用super,缺点是子类参数要和父类参数一致。
2.经典类的继承方法是错误的,新式类的继承方法是正确的;如果是单继承,父类和子类方法名相同,执行子类方法。如果是多继承,被继承的几个父类和子类方法名相同,
Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:经典类深度优先和新式类广度优先
* @classmethod静态方法:和类关系不大,但是属于类的下一级;不需要实例化即可调用,实例不会传递给该函数,类也不会给数据给静态方法,类的工具包; @classmethod
类方法:不需要实例化即可调用,不能访问实例数据,可以访问类数据;@property将函数变成静态属性。
*类成员的修饰符:
类成员:
公有成员,在任何地方都能访问;
私有成员,只有在类的内部才能方法
静态字段(类变量)
公有静态字段:类可以访问;类内部可以访问;派生类中可以访问
私有静态字段:仅类内部可以访问;
普通字段
公有普通字段:对象可以访问;类内部可以访问;派生类中可以访问
私有普通字段:仅类内部可以访问;
*类的特殊成员:__init__、__call__、__str__等会根据相应的程序自动执行。
*异常:
在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面。
对于特殊处理或提醒的异常需要先定义,最后定义Exception来确保程序正常运行。
*反射是通过字符串的形式操作对象相关的成员。
*单例模式,单例模式用来保证一个类在内存中仅存在一个实例,避免内存浪费
参考文章: