实例1:
- #-*-coding:UTF-8-*-
- class FirstDemo(object):
- """
- 这里是一个doc
- """
- a=10 #类属性
- def demo(self):
- """
- 第一个方法
- """
- pass
- def demo2(self):
- """
- 第二个方法
- """
- pass
- print FirstDemo.__dict__ #打印出FirstDemo类的所有属性和方法,结果为一个字典
- print FirstDemo.__bases__ #类的基类
- print FirstDemo.__doc__ #类的docstring
- print FirstDemo.__name__ #类的名字
- print FirstDemo.__module__ #类所在模块,如果是主文件,就是__main__
- print FirstDemo().__class__ #类的类型<class '__main__.FirstDemo'>
- print FirstDemo().__module__ #实例类型所在模块
- print FirstDemo().__dict__ #对象的字典,存储所有实例成员信息
实例2:
- #-*-coding:UTF-8-*-
- class FirstDemo(object):
- b=100 #类属性
- def __init__(self):
- FirstDemo.b=200
- def __repr__(self):
- return "repr方法"
- def __str__(self):
- return "str方法"
- def demo(self):
- print FirstDemo.b
- a=FirstDemo()
- print a.__repr__()
- print a.__str__()
- print "--------"
- a.demo()
结果:
repr方法
str方法
--------
200
序号 | 目的 | 所编写代码 | Python 实际调用 |
---|---|---|---|
① | 初始化一个实例 | x = MyClass() | x.__init__() |
② | 字符串的“官方”表现形式 | repr(x) | x.__repr__() |
③ | 字符串的“非正式”值 | str(x) | x.__str__() |
| |||
|
|
最后打印的b的值为200,是因为__init__()方法的调用发生在实例被创建之后。
实例3(对象属性的操作):
- #-*-coding:UTF-8-*-
- class FirstDemo(object):
- b=100 #类属性
- def __init__(self):
- FirstDemo.b=200
- def __repr__(self):
- return "repr方法"
- def __str__(self):
- return "str方法"
- def demo(self):
- print FirstDemo.b
- a=FirstDemo()
- a.temp=500 #为对象添加一个属性
- print a.__dict__ #查看对象的实例属性字典
- print dir(a) #列出实例的属性和方法集合
- del a.temp #删除对象中的temp属性
- print a.__dict__
- print dir(a)
基本属性
x.__init__() 初始化一个实例,在实例创建之后立即调用,并且这个方法没有返回值(无return语句)
x.__repr__() 字符串的“官方”表示方法 >>> x <==> >>>x.__repr__()
x.__str__() 字符串的非正式值 等同于 print x
x.__new__() 一般是用来生成一个不可变实例,控制实际创建的进程
迭代器
seq.__iter__() 遍历某个序列
seq.__next__() 从迭代器中获取下一个值
把一个对象生命成迭代器的过程:
__init__()方法执行赋值操作;__iter__() 中return self
计算属性
x.__getattribute__('my_property') 无条件获取一个计算属性;
如果某个类定义了 __getattribute__() 方法,在每次引用属性或者方法名称时候,Python 都调用它(特殊方法名称除外,因为那样将会导致讨厌的无限循环)。
x.__getattr__('my_property') 获取一个计算属性(后备)
如果某个类定义了 __getattr__() 方法,Python 将只在正常的位置查询属性时才会调用它。
如果实例 x 定义了属性 color, x.color 将不会调用x.__getattr__('color');而只会返回 x.color 已定义好的值。
x.__setattr__('my_property',value) 设置某一属性
x.__delattr__('my_attribute') 删除某一属性
x.__dir__() 列出某一属性和方法
如果定义了 __getattr__() 或 __getattribute__() 方法, __dir__() 方法将非常有用。通常,调用 dir(x) 将只显示正常的属性和方法。如果 __getattr()__ 方法动态处理color 属性, dir(x) 将不会将 color 列为可用属性。可通过覆盖 __dir__() 方法允许将 color 列为可用属性,对于想使用你的类但却不想深入其内部的人来说,该方法非常有益。