Python核心编程---读书笔记:第13章 面向对象编程

来源:互联网 发布:守望先锋的衰落 知乎 编辑:程序博客网 时间:2024/06/04 18:10

 

第13章  面向对象编程

13.1介绍

经典类:没有父类的类

类中参数self等同于this

__init__() 类似于类的构造器,python创建对象时就会执行该方法

 

子类的初始化时,先调用父类的构造函数初始化,子类需要定义自己构造器,否则基类构造器会被调用,若子类重写构造器,父类的不会被调用

def __init__(self , name , phone , id):

         ParentClass.__init__(self, name , phone)

         self.id= id

 

 

多态:一个操作,多个响应

反射:对象在运行期获取自身信息

静态成员:跟踪与类相关的值

class Test(object):

         name= ‘dong’ #静态成员

dir(对象):返回对象的属性名字列表

 

 

13.4.3特殊的类属性

C.__name__ :类的名字

C.__doc__ : 类C的文档字符串

C.__bases__: 类C的所有父类构成的元组

C.__dict__ :属性

C.__module__: 类C所在模块

C.__class__ :实例C对应的类

 

__new__():调用类的__new__()方法,是静态方法,会调用父类的__new__()来创建对象

__del__():解构器方法,只能被调用一次

总结:

1先调用父类的__del__()

尽量不要实现__del__()

 

13.6.1实例化实例属性

在运行时创建实例属性,python是动态语言,允许对象属性动态创建

修改静态成员变量危险

 

 

13.7.1调用绑定方法

13.8.1 staticmethod()和classmethod()内建函数

静态方法

clas MyClass:

@staticmethod

def foo

 

13.10.1创建子类

class SubClass(ParClass1, ParClass2,…)

__base__ :返回其父类的元组

子类中调用父类方法:

super(ChildClass , self).foo()

重写__init__不会自动调用基类的__init__,如果需要,就要调用积累的构造方法

super(ParentClass , self).__init__()

 

 

13.11.4多重继承

方法解释顺序(MRO):深度优先,从左到右搜索,取得在子类中使用的属性,取找到的第一个名字

C2.bar(gc)

想要指定调用父类的方法,就在父类该方法中传入子类实例

 

经典类:没有继承自object,深度优先

新式类:继承自object,广度优先

新式类查找方法采用广度优先,优先搜索父类,然后才是祖先类

 

13.12类、实例和其他对象的内建函数

13.12.1 issubclass()判断一个类是另一个类的子类或者子孙类

issubclass(sub , sup)

 

class Parent(object):
    def __init__(self, name):
        self.name= name

class Child(Parent):
    def  __init__(self,name ,age):
        super(Parent, self).__init__()
        self.age = age

if __name__ == "__main__":
    if issubclass(Child , Parent):
        print("child is subclass of parent")

 

 

isinstance():判断一个对象是否是另一个类的实例

isinstance(obj1 , obj2):

isinstance(4,int)

isinstance(4, tuple(int , float))

 

 

hasattr():判断对象是否有特定属性

getattr():

setattr():

 

if hasattr(child ,'age'):
    print("has attr age")
    myage = getattr(child, 'age')
    print('age is %d'% (myage))
    setattr(child, 'age', 33)
    print('age changed is %d'% (child.age))
else:
    print("not has attr age")

 

 

dir():作用在实例上,显示实例所在类(包含基类)的方法和属性

    

 

super(type , obj):返回type的父类,向父类绑定,传入obj

super(ParentClass , self).__init__()

vars():返回字典,包含对象的属性和

 

__del__():析构器

delattr(obj , attr):删除属性

 

定制类的特殊方法

C.__cmp__(self , obj)

C.__lt__(self , obj) and

C.__*add__(self , obj): 加: +操作符

C.__*or__(self , obj): 按位或

C.__neg__(self):一元负

C.__int__(self):转换为int

 

重载加法使用__add__()

def __add__(self , other):

         returnself.__class__(self.hr + other.hr , self.min + other,min)

 

原位加: def __iadd__(self , other)

 

13.13.3 迭代器(RandSeq和AnyIter)

创建迭代器使用__iter__(),和next()方法

 

多类型定制:参见重载加法,乘法,比较等函数

 

13.14 私有化

双下划线__ :等同于private

单下划线_ :模块级别私有化

 

实现授权的关键点:覆盖__getattr__()方法

 

严格匹配用 is操作符, isinstance()很灵活

 

__slots__类属性

假设实例为inst,属性为foo,

使用inst.foo和inst.__dict__[‘foo’]访问是一致的

如果属性很少,实例很多,使用__slots__属性来替代__dict__。

__slots__ :包含了属性集合,可节约内存

 

__getattribute__():__getattr__()在属性不能从类中找到时才被调用

 

13.16.4 描述符

描述符:对象属性的代理,是一个类属性

__get__(),__set__() , __delete__()

 

property(fget=None,fset=None,fdel=None,doc=None)

将property写在类定义中

 

 

13.16.5 Metaclasses和__metaclass__

元类:定义类如何被创建,其实例是其他的类。

适用:用于创建类。解释器寻找类属性__metaclass__,如果属性存在,就将属性赋值给此类作为它的元类。

传递的参数:类名,从基类继承数据的元组,类属性字典

元类的作用:改变类的默认行为

 

另一种元类用法:创建元类,要求其他人写的类中都提供__str__()方法

 

 

 

0 0
原创粉丝点击