您的位置:首页 > 编程语言 > Python开发

Python核心编程(第十三章)--面向对象编程

2016-06-02 15:43 316 查看
面向对象编程主要是类和类的实例
创建类:
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的对象
[b]super并非是一个函数,而是一个类[/b]

Python ljust() 方法返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串。如果指定的长度小于原字符串的长度则返回原字符串。
多重继承:
经典类:
经典类的搜索方式是按照“从左至右,深度优先”的方式去查找属性。d先查找自身是否有foo方法,没有则查找最近的父类C1里是否有该方法,如果没有则继续向上查找,直到在P1中找到该方法,查找结束。
新式类:沿着继承树一步一步上溯不同,它先查找同胞兄弟采用广度优先的方式
类、实例内建函数:
issubclass(sub,sup)判断sub是否为父类sup的
4000
子类,是的话返回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中大多数标准操作符函数版本

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  读书笔记