Python核心编程(第十三章)--面向对象编程
面向对象编程主要是类和类的实例
创建类:
class MyNewObjectType(bases):
'define MyNewObjectType class'
class_suite
关键词是class,紧接着是一个类名,随后是定义类的类体代码
object是 所有类之母, 如果你所写的类没有继承其他任何父类,object将作为默认父类。它位于所有类继承结构的最上层。
创建一个实例的过程称为实例化:
myFirstObject = MyNewObjectType()
类的功能即方法
所有的方法声明中都有self参数,这个参数代表实例对象本身,当用实例调用方法时,不需要传递self,他是自动传入的
如果有两个参数,调用只需要传递第二个参数就好
init()是一个特殊的方法,当Python创建失利后,在实例化过程中调用__init__()方法
创建子类:
继承的子类将保持已存在类所有特性

类的创建:
简单的类的生声明可以是关键字后紧跟类名
在Python中定义紧跟着声明, 并且同时所有的方法也必须同时被定义
类属性:
想知道一个类有哪些属性有两种方法:
1)使用内建函数dir(),返回的是对象属性的一个名字列表
2)访问类的字典属性__dict__,返回的是一个字典,键是属性名,键值是相应属性对象的数据值
特殊类:

init()是在解释器为你创建一个实例后调用的第一个方法
new()构造器方法:它作用在构造方法建造实例之前,在__init__()启动之前,new()决定是否要使用该__init__()方法+
继承自object的新式类才有__new__
在实例化开始之后,在调用 init() 方法之前,Python 首先调用 new() 方法:
def new(cls,*args,**kwargs):
...
第一个参数cls是当前正在实例化的类。
如果要得到当前类的实例,应当在当前类中的 new() 方法语句中调用当前类的父类的 new() 方法。
事实上如果(新式)类中没有重写__new__()方法,即在定义新式类时没有重新定义__new__()时,Python默认是调用该类的直接父类的__new__()方法来构造该类的实例,如果该类的父类也没有重写__new__(),那么将一直按此规矩追溯至object的__new__()方法,因为object是所有新式类的基类。
解构器(del()):是在实例释放前提供特殊处理功能的方法,通常要到该实例对象所有的引用都被清除掉后才会执行。
解构器只能被调用一次
静态方法:
staticmethod(静态方法) 基本上和一个全局函数差不多,只不过可以通过类或类的实例对象(python里光说对象总是容易产生混淆, 因为什么都是对象,包括类,而实际上类实例对象才是对应静态语言中所谓对象的东西)来调用而已, 不会隐式地传入任何参数。这个和静态语言中的静态方法比较像。
classmethod ( 类方法) 是和一个class相关的方法,可以通过类或类实例调用,并将该class对象(不是class的实例对象)隐式地 当作第一个参数传入。就这种方法可能会比较奇怪一点,不过只要你搞清楚了python里class也是个真实地 存在于内存中的对象,而不是静态语言中只存在于编译期间的类型。
函数修饰符:@staticmethod 和 @classmethod
组合: 让不同的类混合并加入到其他类中,增加功能和代码重用性
子类:
创建子类和普通类没什么区别
class SubClassName(ParentClass1[,ParentClass2,...]):
'optional class documentation string'
class_suite
继承:继承描述了基类的属性如何遗传给派生类,一个子类可以继承它的基类的任何属性
super语句调用父类方法 , 在super机制里可以保证公共父类仅被执行一次 对于super(B, self).init()是这样理解的:super(B, self)首先找到B的父类(就是类A),然后把类B的对象self转换为类A的对象
super并非是一个函数,而是一个类
Python ljust() 方法返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串。如果指定的长度小于原字符串的长度则返回原字符串。
多重继承:
经典类: 经典类的搜索方式是按照“从左至右,深度优先”的方式去查找属性。d先查找自身是否有foo方法,没有则查找最近的父类C1里是否有该方法,如果没有则继续向上查找,直到在P1中找到该方法,查找结束。
新式类:沿着继承树一步一步上溯不同,它先查找同胞兄弟采用广度优先 的方式
类、实例内建函数:
issubclass(sub,sup)判断sub是否为父类sup的子类,是的话返回True
isinstance(obj1,obj2)判定一个对象是否是另一个给定类的实例:obj1是类obj2或obj的一个子类的一个实例(第二个参数应该是类)
str__和__repr: 函数str() 用于将值转化为适于人阅读的形式,而repr() 转化为供解释器读取的形式
原位加法:iadd(),用来支持a+=b这样的操作符


特殊方法:
这些方法都是以__开始和结尾的

私有化:
双下划线(__):为类元素的私有性提供初步的形式,这种双下划线开始的属性被“混淆”(不能直接访问,需要在名字前面加上类名),这种私有成员只有类对象自己可以访问,子类对象不能访问
私有变量会在代码生成之前被转换为长格式(变为公有)
单下划线(_):
"单下划线" 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量
高级特性:
__slots__类属性: 是一个类变量,由一序列型对象组成(可以是一个列表,元组或可迭代对象)
这种特性目的是节约内存(带__slots__ 属性的类不存在__dict__了 )
getattribute() : 通过实例访问属性, 如果class中定义了__getattr__(),则__getattr__()不会被调用(除非显示调用或引发AttributeError异常),每个属性的实例都会调用这个特殊方法
描述符:描述符可以实现这三种方法:get(),set(),delete()
函数是非数据描述符,函数的__get__()方法用来处理调用对象,并将调用对象返回给你
数据描述符协议函数Property()
- **property(fget= None,fset=None,fdel=None,doc=None) **
- 前面 3个参数都是未绑定的方法,所以它们事实上可以是任意的类成员函数
前三个参数分别对应数据描述符中的__get__,set,__del__方法
元类(Metaclasses): 可以认为元类的实例是类,元类一般用于创建类(类工厂)
__metaclass__属性:如果类中有__metaclass__属性就 用来创建类,没有就在父类中查找
用type创建类: type(class_name,bases,dic)
元类参考:http://blog.jobbole.com/21351/#,写的很好
模块:operator模块提供了Python中大多数标准操作符函数版本

