} } }

    Python入门笔记(25):Python面向对象(2)

    添加时间:2013-7-15 点击量:

    一、类


    类就是一个数据布局,封装了数据和操纵。


    类的声明与函数的声明十分类似:



    class newClass(object):
    
    class documentation string类文档字符串
    class_suite 类体


    重视:类是对象(在Python中,一切皆对象),然则类在定义的时辰,还不是对象的实现。



    二、类属性



    在面向对象的编程和思惟中,呈现了类属性的概念。

    在java中,类的实例变量和静态变量称为类属变量(class‘s variables,常称为类变量)或数据域(java说话法度设计(根蒂根基篇)》,机械产业出版社,p185)。

    在面向对象的编程说话Python中,类属性就是在类中定义的变量。

    在C++中,类属性是描述类的所有对象共同特点的一个数据项,对于任何对象实例,它的属性值是雷同的。

    不合的编程说话有不合的定义。而有些说话是不区分static类型的,所以并不克不及用static来默示这个属性是否为类属性。只不过用static润饰的属性可以实现对象间的数据共享罢了。


    属性:就是属于另一个对象的数据或函数元素。

    在Python中一个有趣的现象是:当接见一个属性时,它同时也是一个对象。拥有它本身的属性可以接见,这就造成了一个属性链。


    1、类的数据属性:


    就是定义类的变量,即静态变量,或静态数据。它们与所属的类对象绑定,不依附任何类实例。这里类型的数据相当于在变量前面加上static。



    class newClass(object):
    
    foo
    = 100

    print newClass.foo 100
    newClass.foo+=100
    print newClass.foo 200


    类属性与实例属性不一样。


    2、办法


    办法也成为类属性。


    3、查看类属性


    应用内建函数dir()或类的字典属性__dict__都可以。



    class newClass(object):
    
    def foo(self):
    pass
    print dir(newClass)
    [__class__, __delattr__, __dict__, __doc__, __getattribute__, __hash__, __init__, __module__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__, __weakref__, foo]
    print newClass.__dict__
    {__dict__: <attribute __dict__ of newClass objects>, __module__: __main__, foo: <function foo at 0 x00B00A30>, __weakref__: <attribute __weakref__ of newClass objects>, __doc__: None}


     




    class newClass(object):
    
    Python Class
    def foo(self):
    pass

    print newClass.__name__ newClass
    print newClass.__doc__ Python Class
    print newClass.__bases__ (<type object>,)
    print newClass.__base__ <type object>
    print newClass.__module__ __main__
    print newClass.__class__ <type type>



    三、实例


    1、关于类的实例


    类是一种数据布局定义类型,那么实例就是声明这种类型的变量。



    class newClass(object):
    
    Python Class
    def foo(self):
    pass

    c
    = newClass()
    print type(c) <class __main__.newClass>,而在Python2.2版本之前,实例是”实例类型“从不推敲从哪个类来的
    print type(0) <type int>
    print type(newClass) <type type>
    print type(int) <type type>两者都是类型


    重视,在2.2版本之后,当定义一个新式类后,你已创建一个新的类型。



    2、__init__() “机关器”办法


    不经由过程new来创建实例,你也没有定义一个机关器,是Python为你创建对象


    __init__()是在申明器为你创建一个实例后调用的第一个办法


    若是没有定义(或覆盖)特别办法__init__().则对实例不会施加任何特别的操纵。



    3、__new__()“机关器”办法


    与__init__()比拟,__new__()则更像一个真正的机关器。



    4、__del__()解构器办法



    四、类属性与实例属性


    参考:http://www.pythonfan.org/thread-9827-1-1.html


    python中的类属性只是存储与类相干 的数据,和该类的实例无关。类属性和java中的静态成员变量类似。接见python的类属性可应用类名+“.”+属性名的体式格式,若是类的实例没有同名变 量也可以应用实例来接见。若是实例含有与类属性同名的属性,则用该实例接见属性时,接见的是实例中的属性。




    class Test():   
    
    myVersion
    =1.0 声明一个类属性,并赋值为1.0

    t
    =Test() 生成一个实例
    Test.myVersion 应用类空间来接见类属性 ,输出为 1.0
    t.myVersion 应用实例空间来接见类属性,输出为1.0
    Test.myVersion=2.0 应用类空间来更新类属性
    Test.myVersion 应用类空间来接见类属性 ,输出为 2.0
    t.myVersion 应用实例空间来接见类属性,输出为2.0




    只有应用类空间引用类属性时,才干设定和更新类属性。若是测验测验应用实例空间来引用类属性来进行更新,则该实例(若是没有同名属性的话)会创建一个与该类属性同名的实例属性。该实例属性会阻拦实例对类属性的接见,直到该实例的同名属性被清除掉。




    t.myVersion=3.0 实例t会创建一名为‘myVersion’的实例属性
    
    Test.myVersion 输出2.0,上一条语句并不会对类属性产生任何影响
    t.myVersion 输出3.0,t接见的是自身的实例属性
    del t.myVersion 清除t的实例属性
    t.myVersion 输出2.0,此时接见的是类属性



    然则,在类属性可变的景象下,工作又不一样了



    Test.x={myVersion:1.0} 给Test类添加一个新的类属性
    
    Test.x 用类空间接见该属性 输出 {myVersion:1.0}
    t.x 用实例空间接见该属性 输出 {myVersion:1.0}
    t.x[myVersion]=2.0
    t.x
    输出{myVersion:2.0}
    Test.x 输出{myVersion:2.0} # 实例t的更新操纵对类属性生效了
    del t.x 失足 :t instance has no attribute x


     



     





    真正的心灵世界会告诉你根本看不见的东西,这东西需要你付出思想和灵魂的劳动去获取,然后它会照亮你的生命,永远照亮你的生命。——王安忆《小说家的十三堂课》
    分享到: