第八章 类与对象
属性
python通过约定实现数据封装
- 以_开头的属性代表内部实现
- 以__开头的属性会重命名,目的是避免继承后被覆盖
property
属性管理
装饰器
不改变原有逻辑的前提下增加逻辑,比如日志、事务、性能测试
函数装饰器(支持目标函数携带任意参数)
类装饰器(实现了__call__方法)
functools.warp 保留目标函数元信息
多个修饰器,由内至外执行
def deco(fun):
def wrapper(*args, **kw):
print("start to invoke ")
print("args: ", args)
print("kw: ", kw)
r = fun(args, kw)
print("end to invoke ")
return r
return wrapper
@deco
def f(params, a=1):
print("function[%s] invoked"%params)
return params
class Foo(object):
def __init__(self, func):
self.func = func
def __call__(self, *args):
print("start to call")
self.func(args)
print("end call")
@Foo
def foo(a):
print("foo function invoke[%s]"%a)
# Example
if __name__ == '__main__':
r = f("123", a=12)
print(r)
foo("foo")
描述器<广泛使用>
实现了__get__,set,__delete__方法的类
使用方式: 描述器类实例作为类属性
对象属性查找过程
在调用对象方法或者访问属性时,实际调用的是getattribute方法,此方法会先去对象的__dict__中查找,若找不到则再去类的__dict__中查找,若找不到最后调用getattr方法。一般情况下,不修改getattribute方法,而是修改getattr方法