Python——类属性/实例属性
2015-10-18 22:44
330 查看
一、类属性
类属性仅与其被定义的类相绑定。类数据属性仅当需要有更加“静态”数据类型时才变得有用,它和任何实例都无关。
1. 类的数据属性
数据属性仅仅是所定义的类的变量。这种属性已被 OO 程序员所熟悉,即静态变量,或者是静态数据。它们表示这些数据是与他们所属的类对象绑定的,不依赖于任何类实例。静态成员通常仅用来跟踪与类相关的值。
[python] view
plaincopy
>>> class C(object):
... foo = 100
...
>>> print(C.foo)
100
>>> C.foo = C.foo + 1
>>> print(C.foo)
101
2. Methods
[python] view
plaincopy
>>> class MyClass(object):
... def myNoActionMethod(self):
... pass
...
>>> mc = MyClass()
>>> mc.myNoActionMethod()
类 MyClass 中的 myNoActiveMethod() 方法,仅仅是一个作为类定义一部分定义的函数(这使得方法成为类属性)。这表示 myNoActiveMethod 仅应用在 MyClass 类型的对象(实例)上。
任何像函数一样对 myNoActiveMethod() 自身的调用都将失败:
[python] view
plaincopy
>>> myNoActionMethod()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'myNoActionMethod' is not defined
引发了 NameError 异常。这就说明 myNoActionMethod 是一个方法,表示它属于一个类,而不是全局空间中的名字。由类对象调用此方法也失败。
[python] view
plaincopy
>>> 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__。
[python] view
plaincopy
>>> 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.showMyVersion at 0x01D98F18>, '__dict__': <attribute '__dict__' of 'MyClass
' objects>, 'myVersion': '1.1', '__doc__': 'MyClass class definition'})
dir() 返回的仅是对象的属性的一个名字类表,而 __dict__ 返回的是一个字典,它的键(key)是属性名,键值(value)是相应的属性对象的数据值。
4. 特殊的类属性
__name__ 是给定类的字符名字。它适用于那种只需要字符串(类对象的名字),而非对象本身的情况。__doc__是类的文档字符串,与函数及模块的文档字符串相似,必须紧随头行后的字符串。文档字符串不能被派生类继承,也就是说派生类必须含有他们自己的文档字符串。__bases__用来处理继承,它包含了一个由所有父类组成的元组。__dict__属性包含一个字典,由类的数据属性组成。
[python] view
plaincopy
>>> MyClass.__name__
'MyClass'
>>> MyClass.__doc__
'MyClass class definition'
>>> MyClass.__bases__
(<class 'object'>,)
>>> print(MyClass.__dict__)
{'__module__': '__main__', '__qualname__': 'MyClass', '__weakref__': <attribute
'__weakref__' of 'MyClass' objects>, 'showMyVersion': <function MyClass.showMyVe
rsion at 0x01D98F18>, '__dict__': <attribute '__dict__' of 'MyClass' objects>, '
myVersion': '1.1', '__doc__': 'MyClass class definition'}
二、实例属性
实例仅拥有数据属性,它是与某个类的实例相关联的数据值,这些值独立于其他实例或类。当一个实例被释放后,它的属性同时也被清除了。
1. “实例化”实例属性
设置实例的属性可以在实例创建后任意时间进行,也可以在能够访问实例的代码中进行。构造器 __init__() 是设置这些属性的关键点之一。
2. 查看实例属性
内建函数 dir() 可以显示类属性,同样还可以打印所有实例属性:
[python] view
plaincopy
>>> 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__特殊属性,它是实例属性构成的一个字典:
[python] view
plaincopy
>>> c.__dict__
{'foo': 'roger', 'bar': 'shrubber'}
3. 特殊的实例属性
类属性仅与其被定义的类相绑定。类数据属性仅当需要有更加“静态”数据类型时才变得有用,它和任何实例都无关。
1. 类的数据属性
数据属性仅仅是所定义的类的变量。这种属性已被 OO 程序员所熟悉,即静态变量,或者是静态数据。它们表示这些数据是与他们所属的类对象绑定的,不依赖于任何类实例。静态成员通常仅用来跟踪与类相关的值。
[python] view
plaincopy
>>> class C(object):
... foo = 100
...
>>> print(C.foo)
100
>>> C.foo = C.foo + 1
>>> print(C.foo)
101
2. Methods
[python] view
plaincopy
>>> class MyClass(object):
... def myNoActionMethod(self):
... pass
...
>>> mc = MyClass()
>>> mc.myNoActionMethod()
类 MyClass 中的 myNoActiveMethod() 方法,仅仅是一个作为类定义一部分定义的函数(这使得方法成为类属性)。这表示 myNoActiveMethod 仅应用在 MyClass 类型的对象(实例)上。
任何像函数一样对 myNoActiveMethod() 自身的调用都将失败:
[python] view
plaincopy
>>> myNoActionMethod()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'myNoActionMethod' is not defined
引发了 NameError 异常。这就说明 myNoActionMethod 是一个方法,表示它属于一个类,而不是全局空间中的名字。由类对象调用此方法也失败。
[python] view
plaincopy
>>> 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__。
[python] view
plaincopy
>>> 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.showMyVersion at 0x01D98F18>, '__dict__': <attribute '__dict__' of 'MyClass
' objects>, 'myVersion': '1.1', '__doc__': 'MyClass class definition'})
dir() 返回的仅是对象的属性的一个名字类表,而 __dict__ 返回的是一个字典,它的键(key)是属性名,键值(value)是相应的属性对象的数据值。
4. 特殊的类属性
C.__name__ | 类C的名字(字符串) |
C.__doc__ | 类C的文档字符串 |
C.__bases__ | 类C的所有父类构成的元组 |
C.__dict__ | 类C的属性 |
C.__module__ | 类C定义所在的模块 |
C.__class__ | 实例C对应的类 |
[python] view
plaincopy
>>> MyClass.__name__
'MyClass'
>>> MyClass.__doc__
'MyClass class definition'
>>> MyClass.__bases__
(<class 'object'>,)
>>> print(MyClass.__dict__)
{'__module__': '__main__', '__qualname__': 'MyClass', '__weakref__': <attribute
'__weakref__' of 'MyClass' objects>, 'showMyVersion': <function MyClass.showMyVe
rsion at 0x01D98F18>, '__dict__': <attribute '__dict__' of 'MyClass' objects>, '
myVersion': '1.1', '__doc__': 'MyClass class definition'}
二、实例属性
实例仅拥有数据属性,它是与某个类的实例相关联的数据值,这些值独立于其他实例或类。当一个实例被释放后,它的属性同时也被清除了。
1. “实例化”实例属性
设置实例的属性可以在实例创建后任意时间进行,也可以在能够访问实例的代码中进行。构造器 __init__() 是设置这些属性的关键点之一。
2. 查看实例属性
内建函数 dir() 可以显示类属性,同样还可以打印所有实例属性:
[python] view
plaincopy
>>> 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__特殊属性,它是实例属性构成的一个字典:
[python] view
plaincopy
>>> c.__dict__
{'foo': 'roger', 'bar': 'shrubber'}
3. 特殊的实例属性
I.__class__ | 实例化I的类 |
I.__dict__ | I 的属性 |
相关文章推荐
- Python——面向对象编程(引言)
- Python——条件、循环和其他语句
- Python——字典
- Python——字符串
- Python——序列
- Python基础:__name__
- Python之struct简介
- Python——列表,元组
- python自动加载任意个属性数据
- python例子-MySQLdb和练习题
- python例子-线程和队列
- Python中::(双冒号)的用法
- PYTHON:新闻聚合
- 用Python生成随机的中文验证码图片
- 通过读写文本文件小结“关于python处理中文编码的问题”
- 5个常用的Python功能代码
- 构建基于Spark的推荐引擎(python实现)
- Python在机器学习中常用函数介绍
- python保存文件UnicodeEncodeError以及reload(sys)后print失效问题
- Python v3.4 not found的解决方法