龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > python编程 >

Python入门篇之面向对象(3)

时间:2014-10-21 11:47来源:网络整理 作者:网络 点击:
分享到:
特殊的类属性 对任何类C,表显示了类C的所有特殊属性: C.__name__ 类C的名字(字符串) C.__doc__ 类C的文档字符串 C.__bases__ 类C的所有父类构成的元

特殊的类属性
 
对任何类C,表显示了类C的所有特殊属性: 
C.__name__        类C的名字(字符串)
C.__doc__         类C的文档字符串
C.__bases__       类C的所有父类构成的元组
C.__dict__        类C的属性
C.__module__      类C定义所在的模块(1.5 版本新增)
C.__class__       实例C对应的类(仅新式类中)

复制代码 代码如下:

>>> myclass.__name__
'myclass'
>>> myclass.__doc__
'myclass class definition'
>>> myclass.__bases__
(<type 'object'>,)
>>> print myclass.__dict__
{'__module__': '__main__', 'showVesion': <function showVesion at 0x0134C9B0>, '__dict__': <attribute '__dict__' of 'myclass' objects>, 'myVersion': '1.1', '__weakref__': <attribute '__weakref__' of 'myclass' objects>, '__doc__': 'myclass class definition'}
>>> myclass.__module__
'__main__'
>>> myclass.__class__
<type 'type'>

实例
 
如果说类是一种数据结构定义类型,那么实例则声明了一个这种类型的变量。实例是那些主要用在运行期时的对象,类被实例化得到实例,该实例的类型就是这个被实例化的类。
 
初始化:通过调用类对象来创建实例
 
Python 的方式更加简单。一旦定义了一个类,创建实例比调用一个函数还容易------不费吹灰之力。实例化的实现,可以使用函数操作符,如下示:
 
>>> class MyClass(object): # define class 定义类
        pass
>>> mc = MyClass() # instantiate class 初始化类    
__init__()"构造器"方法
 
当类被调用,实例化的第一步是创建实例对象。一旦对象创建了,Python 检查是否实现了__init__()方法。默认情况下,如果没有定义(或覆盖)特殊方法__init__(),对实例不会施加任何特别的操作.任何所需的特定操作,都需要程序员实现__init__(),覆盖它的默认行为。
 
如果__init__()没有实现,则返回它的对象,实例化过程完毕。
 
如果__init__()已经被实现,那么它将被调用,实例对象作为第一个参数(self)被传递进去,像标准方法调用一样。调用类时,传进的任何参数都交给了__init__()。实际中,你可以想像成这样:把创建实例的调用当成是对构造器的调用。
 
__new__()“构造器”方法
 
与__init__()相比,__new__()方法更像一个真正的构造器。需要一种途径来实例化不可变对象,比如,派生字符串,数字,等等。在这种情况下,解释器则调用类的__new__()方法,一个静态方法,并且传入的参数是在类实例化操作时生成的。__new__()会调用父类的__new__()来创建对象(向上代理)。__new__()必须返回一个合法的实例。
 
__del__()"解构器"方法
 
同样,有一个相应的特殊解构器(destructor)方法名为__del__()。然而,由于 Python 具有垃圾对象回收机制(靠引用计数),这个函数要直到该实例对象所有的引用都被清除掉后才会执行。Python 中的解构器是在实例释放前提供特殊处理功能的方法,它们通常没有被实现,因为实例很少被显式释放。
 
注意:Python 没有提供任何内部机制来跟踪一个类有多少个实例被创建了,或者记录这些实例是些什么东西。如果需要这些功能,你可以显式加入一些代码到类定义或者__init__()和__del__()中去。最好的方式是使用一个静态成员来记录实例的个数。靠保存它们的引用来跟踪实例对象是很危险的,因为你必须合理管理这些引用,不然,你的引用可能没办法释放(因为还有其它的引用)!看下面一个例子:
 

复制代码 代码如下:

>>> class instCt(object):
    count = 0
    def __init__(self):
        instCt.count += 1
    def __del__(self):
        instCt.count -= 1
    def howMany(self):
        return instCt.count
   
>>> a = instCt()
>>> b = instCt()
>>> b.howMany()
2
>>> a.howMany()
2
>>> del b
>>> a.howMany()
1
>>> del a
>>> instCt.count
0

精彩图集

赞助商链接