面向对象编程:

面向对象(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)返回父类;