Advertisement

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中大多数标准操作符函数版本

全部评论 (0)

还没有任何评论哟~