Python——类属性/实例属性

一、类属性


类属性仅与其被定义的类相绑定。类数据属性仅当需要有更加“静态”数据类型时才变得有用,它和任何实例都无关。


1.类的数据属性


数据属性仅仅是所定义的类的变量。这种属性已被OO程序员所熟悉,即静态变量,或者是静态数据。它们表示这些数据是与他们所属的类对象绑定的,不依赖于任何类实例。静态成员通常仅用来跟踪与类相关的值。


>>>class C(object):

... foo = 100

...

>>>print(C.foo)

100

>>>C.foo = C.foo + 1

>>>print(C.foo)

101

2.Methods

>>>class MyClass(object):

... def myNoActionMethod(self):

... pass

...

>>>mc = MyClass()

>>>mc.myNoActionMethod()

MyClass中的 myNoActiveMethod()方法,仅仅是一个作为类定义一部分定义的函数(这使得方法成为类属性)。这表示myNoActiveMethod 仅应用在MyClass 类型的对象(实例)上。

任何像函数一样对myNoActiveMethod() 自身的调用都将失败:


>>>myNoActionMethod()

Traceback(most recent call last):

File"<stdin>", line 1, in <module>

NameError:name 'myNoActionMethod' is not defined

引发了 NameError异常。这就说明 myNoActionMethod是一个方法,表示它属于一个类,而不是全局空间中的名字。由类对象调用此方法也失败。

>>>MyClass.myNoActionMethod()

Traceback(most recent call last):

File"<stdin>", line 1, in <module>

TypeError:myNoActionMethod() missing 1 required positional argument: 'self'

为与 OOP惯例保持一致,Python严格要求,没有实例,方法是不能被调用的。方法必须绑定到一个实例才能直接被调用。非绑定的方法可能可以被调用,但实例对象一定要明确给出,才能确保调用成功。然而,不管是否绑定,方法都是它所在的类的固定属性,即使它们几乎总是通过实例来调用的。

3.类的属性


要知道一个类有哪些属性,有两种方法。最简单的是使用dir() 内建函数。另外是通过访问类的字典属性__dict__


>>>dir(MyClass)

['__class__','__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__form

at__','__ge__', '__getattribute__', '__gt__', '__hash__', '__init__','__le__',

'__lt__','__module__', '__ne__', '__new__', '__qualname__', '__reduce__', '__r

educe_ex__','__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook

__','__weakref__', 'myVersion', 'showMyVersion']

>>>MyClass.__dict__

mappingproxy({'__module__':'__main__', '__qualname__': 'MyClass', '__weakref__'

:<attribute '__weakref__' of 'MyClass' objects>,'showMyVersion': <function MyC

lass.showMyVersionat 0x01D98F18>, '__dict__': <attribute '__dict__' of 'MyClass

'objects>, 'myVersion': '1.1', '__doc__': 'MyClass classdefinition'})

dir()返回的仅是对象的属性的一个名字类表,而__dict__返回的是一个字典,它的键(key)是属性名,键值(value)是相应的属性对象的数据值。

4.特殊的类属性


C.__name__ C的名字(字符串)

C.__doc__ C的文档字符串

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

C.__dict__ C的属性

C.__module__ C定义所在的模块

C.__class__ 实例C对应的类

__name__是给定类的字符名字。它适用于那种只需要字符串(类对象的名字),而非对象本身的情况。__doc__是类的文档字符串,与函数及模块的文档字符串相似,必须紧随头行后的字符串。文档字符串不能被派生类继承,也就是说派生类必须含有他们自己的文档字符串。__bases__用来处理继承,它包含了一个由所有父类组成的元组。__dict__属性包含一个字典,由类的数据属性组成。


>>>MyClass.__name__

'MyClass'

>>>MyClass.__doc__

'MyClassclass definition'

>>>MyClass.__bases__

(<class'object'>,)

>>>print(MyClass.__dict__)

{'__module__':'__main__', '__qualname__': 'MyClass', '__weakref__': <attribute

'__weakref__'of 'MyClass' objects>, 'showMyVersion': <functionMyClass.showMyVe

rsionat 0x01D98F18>, '__dict__': <attribute '__dict__' of 'MyClass'objects>, '

myVersion':'1.1', '__doc__': 'MyClass class definition'}


二、实例属性


实例仅拥有数据属性,它是与某个类的实例相关联的数据值,这些值独立于其他实例或类。当一个实例被释放后,它的属性同时也被清除了。


1.“实例化”实例属性


设置实例的属性可以在实例创建后任意时间进行,也可以在能够访问实例的代码中进行。构造器__init__() 是设置这些属性的关键点之一。


2.查看实例属性


内建函数 dir()可以显示类属性,同样还可以打印所有实例属性:


>>>class C():

... pass

...

>>>c = C()

>>>c.foo = 'roger'

>>>c.bar = 'shrubber'

>>>dir(c)

['__class__','__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__form

at__','__ge__', '__getattribute__', '__gt__', '__hash__', '__init__','__le__',

'__lt__','__module__', '__ne__', '__new__', '__qualname__', '__reduce__', '__r

educe_ex__','__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook

__','__weakref__', 'bar', 'foo']

实例也有一个__dict__特殊属性,它是实例属性构成的一个字典:

>>>c.__dict__

{'foo':'roger', 'bar': 'shrubber'}

3.特殊的实例属性


I.__class__ 实例化I的类

I.__dict__ I的属性



本文转自:http://m.blog.csdn.net/blog/bolike/21554901


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值