面向对象编程:
面向对象(OO)是一种编程思想;
目的是代码重用;机制是封装、继承和多态;核心是抽象;
--类和对象:
类定义格式:class (super_class1,super_class3,…):
def (self,):
其中类方法的第一个参数是self--表示类实例对象;
在Python中对象(object)泛指一切;
通过object.__dict__可得到对象的命名空间--即对象与名字的映射关系;
通过object.__dict__.keys()和object.__dict__[name]得到key和值;
vars(obj)得到obj的namespace,dir(obj)得到obj所有attribute;
attribute(property和method)中name搜索算法:
1.首先搜索对象的namespace;
2.如果对象是类实例会搜索对象所属类的namespace;
2.1如果对象所属类有父类则会从子类到父类顺序搜索类的namespace;
3.如果对象有__getattr__函数,调用这个函数返回结果;
PS:可以看出在第2步就实现了继承的概念;
--类方法和数据成员:
类方法分为对象绑定方法和对象未绑定方法:
对象绑定方法:第一个参数是self,通过对象调用如obj_name.method();
对象未绑定方法:第一个参数不必是self,通过class_name.method()调用;
class_name.method()的典型应用是调用父类方法;
抽象虚拟函数的定义方式是在函数内直接抛出异常来阻止调用;
在处定义的是类的属性,可通过类和对象调用;
通过self.attr定义的是对象的属性,只能通过对象调用;
使用attribute的定义方法是加前缀"__",这种方法并不是像C++中的private
一样控制,而是系统会在有"__"的属性前加"_classname"前缀预防;
--继承:
python中可以多继承,方式是父类作为元素的tuple放在类名和冒号之间;
每个类实例都有一个"__bases__"的属性记录直接父类的tuple;
重载是通过attribute的所有算法实现的:先搜索子类后搜索父类;
在多继承中父类的顺序决定了搜索算法的查找顺序;
--特殊函数:
如同C++中的构造/析构函数和复制函数等一样,pyhon中也存在特殊函数:
__init__:不同与C++中的构造函数,是在构造完成后的初始化函数;
__del__(self):删除对象时调用;
__repr__(self):使用repr(obj)函数时调用;
__str__(self):返回对象的字符串描述,在需要字符串的地方调用;
__cmp__(self,other):用于比较操作,返回值有(-1,0,1)三个;
__hash__(self):返回一个32位的hash value;
__nozero__(self):定义对象是否为逻辑假(0假1真);
__len__(self):调用内置函数len()时调用;
__getitem__(self,key):模拟obj[key];
__setitem__(self,key,value):模拟obj[key]=value;
__delitem__(self,key):模拟del obj[key];
__contains__(self,other):用于in语句的判断;
__call__(self,arg1,arg2,…):让对象具有函数的行为--类似函数对象;
__getattr__:控制函数的调用;
重载运算操作符:__add__(self,other),__sub__(self,other),
__mul__(self,other),__div__(self,other),__mod__(self,other),
__divmod__(self,other),__pow__(self,other),
__pow__(self,other,modulo),__lshift__(self,other)(左移),
__rshift__(self,other)等;
这里列出的是常用的,但并不是全部;
--new style class:
如果一个class的祖先有"object"类那么这个类就是new style class了;
即:可直接或间接地继承object,但要求祖先中只有一个object;
增加的两种函数:
static methord:定义方法是在函数定义后,在增加一条语句:
func_name=staticmethod(fucn_name)
特点是类和实例都可以调用,而行为与普通函数类似;
class methord:定义方法是在函数定义后,增加语句:
fucn_name=classmethod(fucn_name)
要求函数的第一个参数是类,而不是self表示的对象;
以上两种方法的定义都在函数定义完成后增加一条声明语句;
增加的特殊函数:
__new__:真正的构造函数,默认为class method;
__getattribute__:与__getattr__不同,位于搜索算法的第一步;
在传统类中调用父类是通过父类名来调用,
而new style class通过super(clsobj,obj)返回父类;