编程语言
首页 > 编程语言> > 2021.09.05 - Python重难点总结

2021.09.05 - Python重难点总结

作者:互联网

文章目录

多重继承

顺序问题&同名方法

问题:如果不同的父类中存在 同名的方法,子类对象在调用方法时,会调用哪一个父类中的方法呢?

类的魔法方法(class.__fun__())

这归功于动态语言的“鸭子类型”,不需要强制继承某个接口。

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)

类装饰器

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

标签:__,调用,name,Python,self,2021.09,重难点,print,def
来源: https://blog.csdn.net/weixin_42359693/article/details/120118748