问题:如果不同的父类中存在 同名的方法,子类对象在调用方法时,会调用哪一个父类中的方法呢?
Python 中的 MRO (方法搜索顺序)
print(C.__mro__) #C是多继承后的类名
子类从多个父类派生,而子类又没有自己的构造函数时:
super()与调用父类方法:
父类.__init__(self)
class.__fun__()
)这归功于动态语言的“鸭子类型”,不需要强制继承某个接口。
__init__
__len__
__enter__
和__exit__
__slots__
:定义的属性仅对当前类实例起作用,对继承的子类是不起作用的。__str__
__repr__
for...in
:__iter__
next()
拿到生成器下一个值:__next__
a[1]
:__getitem__
__setitem__
del xxx
:__delitem__
getattr()
:__getattr__
__call__
instance.method()
来调用,直接在实例本身上调用。callable()
:判断一个对象是否是“可调用”对象。class Student(object): def __init__(self, name): self.name = name def __call__(self): print('My name is %s.' % self.name) >>> s = Student('Michael') >>> s() # self参数不要传入 My name is Michael.
from functools import wraps def my_log(fun): @wraps(func) def wrapper(self, *args, **kwargs): print('hello world') print(self) # 获取原函数的实例,从而调用对应实例的一些方法 return func(*args, **kwargs) # 原函数可能有返回值 return wrapper @my_log # 等同于 run = my_log(run),即 run = wrapper。 def run(): print('run') @my_log def add(a, b): print(u'结果是:%s' % (a+b)) run() # run.__name__代表的是 run这个函数的名称 print(run.__name__) add(1, 2)
# 有参数 def my_log(param): def decorator(fun): @wraps(func) def wrapper(self, *args, **kwargs): print(param) print('hello world') print(self) # 获取原函数的实例,从而调用对应实例的一些方法 return func(*args, **kwargs) # 原函数可能有返回值 return wrapper return decorator @my_log("参数") # 等同于 add = decorator,也就是 add = decorator(add),即 add = wrapper????????? def add(a, b): print(u'结果是:%s' % (a+b)) add(1, 2)
*args, **kwargs
:位置传参 与 关键字传参 组合起来即可表示任何参数。解决传参时参数不确定的问题。@wraps(func)
保证了函数相关的__name__ 等私有属性不丢失。class logit(object): def __init__(self, logfile='out.log'): self.logfile = logfile def __call__(self, func): @wraps(func) def wrapped_function(self_func, *args, **kwargs): print("装饰器!!!") print(self_func) # 获取原函数的实例,从而调用对应实例的一些方法 self.notify() # 类的方法 return func(*args, **kwargs) return wrapped_function def notify(self): # logit只打日志,不做别的 pass @logit() # 可以传参 def myfunc1(): pass