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

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

时间:2014-10-21 11:47来源:网络整理 作者:网络 点击:
分享到:
复制代码 代码如下: c = C() c.foo = 'he' c.bar = 'isa' dir(c) ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new_

复制代码 代码如下:

>>> c = C()
>>> c.foo = 'he'
>>> c.bar = 'isa'
>>> dir(c)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'bar', 'foo']

与类相似,实例也有一个__dict__特殊属性(可以调用 vars()并传入一个实例来获取),它是实例属性构成的一个字典:

复制代码 代码如下:

>>> c.__dict__
{'foo': 'he', 'bar': 'isa'}

特殊的实例属性
 
实例仅有两个特殊属性。对于任意对象I:
I.__class__      实例化 I 的类
I.__dict__       I 的属性

复制代码 代码如下:

>>> class C(object):
      pass
>>> c = C()
>>> dir(c)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
>>> c.__dict__
{}
>>> c.__class__
<class '__main__.C'>>>> #可以看到,c还没有属性
>>> c.foo = 1
>>> c.bar = 'ewe'
>>> '%d can of %s please' % (c.foo, c.bar)
'1 can of ewe please'
>>> c.__dict__
{'foo': 1, 'bar': 'ewe'}

内建类型属性
 
内建类型也是类,对内建类型也可以使用dir(),与任何其它对象一样,可以得到一个包含它属性名字的列表:
 

复制代码 代码如下:

>>> x = 2 + 2.4j
>>> x.__class__
<type 'complex'>
>>> dir(x)
['__abs__', '__add__', '__class__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__eq__', '__float__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__int__', '__le__', '__long__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__nonzero__', '__pos__', '__pow__', '__radd__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rmod__', '__rmul__', '__rpow__', '__rsub__', '__rtruediv__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', 'conjugate', 'imag', 'real']

试着访问__dict__会失败,因为在内建类型中,不存在这个属性
 
实例属性 vs 类属性
 
类属性仅是与类相关的数据值,和实例属性不同,类属性和实例无关。这些值像静态成员那样被引用,即使在多次实例化中调用类,它们的值都保持不变。不管如何,静态成员不会因为实例而改变它们的值,除非实例中显式改变它们的值。类和实例都是名字空间。类是类属性的名字空间,实例则是实例属性的。
关于类属性和实例属性,还有一些方面需要指出。可采用类来访问类属性,如果实例没有同名的属性的话,你也可以用实例来访问。

访问类属性
类属性可通过类或实例来访问。下面的示例中,类 C 在创建时,带一个 version 属性,这样通过类对象来访问它是很自然的了,比如,C.version
 

复制代码 代码如下:

>>> class C(object):
    version = 2

精彩图集

赞助商链接