博客信息

Python核心编程(装饰器应用、Python动态特性)

发布时间:『 2019-08-01 02:46』  博客类别:Python  阅读(694)

一个函数拥有多个装饰器的问题

    装饰器用来装饰函数

如果一个函数有多个装饰器,那么,装饰顺序取决于离函数的远近距离(近的先装)

 

相关代码

def add_out1(func):
    print("装饰器开始装饰1")
    def add_in1():
        return '《' + func() + "》"
    return add_in1

def add_out2(func):
    print("装饰器开始装饰2")
    def add_in2():
        return '*' + func() + "*"
    return add_in2

@add_out1
#book_name = add_out1(book_name)
@add_out2
#book_name = add_out2(book_name)
def book_name():
    return '7个男人与1个女人的故事'

# book_name = add_out1(book_name)
# print(book_name())

print(book_name())


小李飞刀_Python



装饰器-装饰固定参数函数以及不固定参数函数

 

装饰固定参数的函数

def func_out(func):
    def func_in(arg):
        func(arg)
    return func_in


@func_out
#func_1 = func_out(func_1)
def func_1(a):
    print("a = %s"%a)

# func_1(10)



def func_out2(func):
    def func_in(a,b):
        func(a,b)
    return func_in

@func_out2
#func_2 = func_out2(func_2)
def func_2(a,b):
    print(a,b)
func_2(1,2)


装饰不定个数参数的函数

def func_out(func):
    def func_in(*args):
        func(*args)
    return func_in

@func_out
def func_1(a):
    print(a)


@func_out
def func_2(a,b):
    print(a,b)


@func_out
def func_3(a,b,c):
    print(a,b,c)
@func_out
def func_0():
    print("我没有参数")

func_1(10)
func_2(10,20)
func_3(10,20,30)
func_0()


装饰器-通用装饰器

通用装饰器装饰什么函数都好用

def func_out(func):
    def func_in(*args,**kwargs):
        print("日志记录")
        return func(*args,**kwargs)
    return func_in
@func_out
def func1(a):
    print(a)
@func_out
def func2(a,b):
    return a + b
# print(func1(10))
@func_out
#b,c为缺省参数
def func3(a,b=2,c=3):
    print(a,b,c)

result = func2(10,20)
print(result)

print(func3(1,2,3))


类装饰器

对闭包的更深层的使用,与Java相比,个人理解,类装饰器替代了抽象类被继承,抽象方法被重写的情况。

class Test():
    def __init__(self,func):
        self.func = func
        print("我是新增功能")
        self.func()
    #解决'Test' object is not callable
    def __call__(self, *args, **kwargs):
        pass
@Test
#test = Test(test)
def test():
    print("我是测试函数")
# TypeError: 'Test' object is not callable
# test()


从上面的代码来看,有点像Java23种设计模式中的模板方法模式

 

python动态特性

python的动态特性:

    动态添加属性:成员属性,类属性

 

动态添加方法:成员方法,类方法,静态方法

 

python动态添加属性

class Student():
    def __init__(self,name):
        self.name = name

stu1 = Student('学生1')
#动态添加属性
stu1.age = 18
#添加类属性
Student.cls_id = 210
#类属性的访问方式:1.类名.属性名  2.对象.属性名
stu2 = Student('学生2')
print(Student.cls_id)
print(stu2.cls_id)


python动态添加方法

 

    成员方法 types.MethodType(函数,对象)

    类方法

 静态方法

class Student():
    def __init__(self,name):
        self.name = name
stu1 = Student('学生1')
stu1.age = 18
Student.cls_id = 210

def study(self):
    print("学习使我快乐")

#如何让一个函数跟类建立关系
# stu1.study = study
# TypeError: study() missing 1 required positional argument: 'self'
# stu1.study()
import types
# 将函数study与对象stu1绑定,手动告诉函数参数self指的是stu1
stu1.study = types.MethodType(study,stu1)
stu1.study()


@classmethod
def testClsMethod(cls):
    print("我是类方法")
    #访问类属性
    print(cls.cls_id)

#动态添加类方法
Student.testClsMethod = testClsMethod
Student.testClsMethod()

@staticmethod
def testStaticMethod():
    print("我是静态方法")


#动态添加静态方法:
Student.testStaticMethod = testStaticMethod
Student.testStaticMethod()


over......


关键字:     Python       核心编程  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有