面向对象进阶
类的成员
变量
实例变量
类变量
方法
实例方法 静态方法 类方法
属性
类的特殊成员:
1. __doc__
表示类的描述信息
class Foo: """ 描述类信息 """ def func(self): pass print Foo.__doc__ #输出:类的描述信息
2__init__
初始化数据,通过类创建对象时,自动触发执行。 类名() 自动执行
class Foo: def __init__(self, name): self.name = name self.age = 18 obj = Foo('zh') # 自动执行类中的 __init__ 方法
3__del__
注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。
class Foo: def __del__(self): pass
4 __call__
对象后面加括号,触发执行。 对象() 自动执行
注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
class Foo: def __init__(self): pass def __call__(self, *args, **kwargs): print '__call__' obj = Foo() # 执行 __init__ obj() # 执行 __call__
5 __dict__
类或对象中的所有成员
class Foo(object): def __init__(self,name,age): self.name = name self.age = age def func(self): pass obj1 = Foo('aaa',99) obj2 = Foo('bbb',89) print(obj1.__dict__) # {'name': 'aaa', 'age': 99} print(obj2.__dict__) # {'name': 'bbb', 'age': 89}
6 __str__
如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。
class Foo: def __str__(self): return 'zhh' obj = Foo() print obj # 输出:zhh
7
__getitem__,obj['xx']
__setitem__,obj['xx'] = 1
__delitem__,del obj['xx']
#!/usr/bin/env python # -*- coding:utf-8 -*- class Foo(object): def __getitem__(self, key): print '__getitem__',key def __setitem__(self, key, value): print '__setitem__',key,value def __delitem__(self, key): print '__delitem__',key obj = Foo() result = obj['k1'] # 自动触发执行 __getitem__ obj['k2'] = 'zhh' # 自动触发执行 __setitem__ del obj['k1'] # 自动触发执行 __delitem__
8__iter__
用于迭代器,之所以列表、字典、元组可以进行for循环,是因为类型内部定义了 __iter__

class Foo(object): def __iter__(self): pass obj = Foo() for i in obj: print i # 报错:TypeError: iter() returned non-iterator of type 'NoneType'

class Foo(object): def __init__(self, sq): self.sq = sq def __iter__(self): return iter(self.sq) obj = Foo([11,22,33,44]) for i in obj: print i
class Foo(object): def __init__(self,name,age): self.name = name self.age = age def func(self): pass def __iter__(self): # return iter([11,22,33,44,55,66]) yield 11 yield 22 yield 33
反射
python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,改四个函数分别用于对对象内部执行:
检查是否含有某成员、获取成员、设置成员、删除成员。
class Foo(object): def __init__(self): self.name = 'zhh' def func(self): return 'func' obj = Foo() # #### 检查是否含有成员 #### hasattr(obj, 'name') hasattr(obj, 'func') # #### 获取成员 #### getattr(obj, 'name') getattr(obj, 'func') # #### 设置成员 #### setattr(obj, 'age', 18) setattr(obj, 'show', lambda num: num + 1) # #### 删除成员 #### delattr(obj, 'name') delattr(obj, 'func')