装饰器的用法
在我们日常工作中,装饰器的使用方法有两种。
第一种:将被调用的函数直接作用为参数传入装饰器的外围函数括弧内;示例如下:
def a(func):
def b(*args, **kwargs):
return func(*args, **kwargs)
return b
def c(name):
print(name)
a©(‘Neo’)
>>> 执行结果如下:
>>> Neo
第二种:将装饰器与被调用函数绑定在一起, @
符号 + 装饰器函数放在被调用函数的上一行,被调用的函数正常定义,只需要直接调用被执行函数即可。示例如下:
def a(func):
def b(*args, **kwargs):
return func(*args, **kwargs)
return b
@a
def c(name):
print(name)
c(‘Neo’)
>>> 执行结果如下:
>>> Neo
最常用的装饰器用法为第二种。
现在我们构建一个 检查字符串类型的装饰器,加深一下对装饰器的理解。
def check_ok(func):
def inner(*args, **kwargs):
result = func(*args, **kwargs)
if result == ‘OK’:
return ‘传入的参数数据为:’%s’’ % result
else:
return ‘传入的参数数据不为:‘OK’’
return inner
@check_ok
def test_str(data):
return data
result = test_str(‘OK’)
print(result)
>>> 执行结果如下:
>>> 传入的参数数据为:‘OK’
result = test_str(‘NO’)
print(result)
>>> 执行结果如下:
>>> 传入的参数数据不为:‘OK’
以上就是一个装饰器的简单用法,后续的学习内容会接触到更多的高级用法。
类的装饰器 - classmethod
classmethod 的功能:可以将类函数不经过实例化即可直接被调用
classmethod 的用法:示例如下
@classmethod
def func(cls, …):
todo
>>> cls 替代普通类函数中的 self ;
>>> 变更为 cls ,表示当前的类
>>> self 代表的是 实例化对象,所以只有通过实例化后,才可以调用
>>> cls 代表的是 类 ,所以即使不通过实例化,也可以调用
*****************************************************
class Test(object):
@classmethod
def add(cls, a, b):
return a + b
print(Test.add(1, 3))
>>> 执行结果如下:
>>> 4
演示案例:
class Cat(object):
def init(self, name):
self.name = name
def eat(self):
print(self.name, ‘喜欢吃鱼’)
@classmethod
def work(cls):
print(‘会抓老鼠’)
dragonLi = Cat(‘狸花猫’)
print(dragonLi.eat(), dragonLi.work())
>>> 执行结果如下:
>>> 狸花猫 喜欢吃鱼
>>> 会抓老鼠
接下来我们不使用 类的实例化 ,直接使用 类 调用 eat() 函数 与 work() 函数
class Cat(object):
def init(self, name):
self.name = name
def eat(self):
print(self.name, ‘喜欢吃鱼’)
@classmethod
def work(cls):
print(‘会抓老鼠’)
dragonLi = Cat(‘狸花猫’)
Cat.eat()
>>> 执行结果如下:
>>> TypeError: Cat.eat() missing 1 required positional argument: ‘self’
>>> 报错缺少重要参数 ‘self’ (没有进行实例化的类,类无法直接调用类函数)
Cat.work()
>>> 执行结果如下:
>>> 会抓老鼠
>>> 绑定了 classmethod 装饰器 的 work() 函数,即使没有实例化,也可以直接被 类 调用
再尝试一下看看 没有装饰器的 eat() 函数 与 使用了 classmethod 装饰器 work() 之间可不可以互相调用
class Cat(object):
def init(self, name):
self.name = name
def eat(self):
print(self.name, ‘喜欢吃鱼’)
@classmethod
def work(cls):
print(‘会抓老鼠’)
cls.eat() # 在 classmethod 装饰器的 work() 函数内 调用 eat() 函数
dragonLi = Cat(‘狸花猫’)
dragonLi.work()
>>> 执行结果如下:
>>> TypeError: Cat.eat() missing 1 required positional argument: ‘self’
>>> 同样报错缺少重要参数 ‘self’
class Cat(object):
def init(self, name):
self.name = name
def eat(self):
print(self.name, ‘喜欢吃鱼’)
self.work()
@classmethod
def work(cls):
print(‘会抓老鼠’)
dragonLi01 = Cat(‘狸花猫’)
dragonLi01.eat()
>>> 执行结果如下:
>>> 执行结果如下:
>>> 狸花猫 喜欢吃鱼
>>> 会抓老鼠
综合以上两个场景,我们得出以下结论:
-
在带有 classmethod 装饰器 的 函数 内,是无法调用普通的 带有 self 的函数的
-
但是在普通的带有 self 的类函数内,是可以调用带有 classmethod 装饰器 的 函数的
类的装饰器 - staticmethod
staticmethod 的功能:可以将 类函数 不经过实例化而直接被调用,被该装饰器调用的函数不需要传入 self 、cls 参数,并且无法在该函数内调用其他 类函数 或 类变量
staticmethod 的用法:参考如下
@staticmethod
def func(…):
todo
>>> 函数内无需传入 cls 或 self 参数
*****************************************************
class Test(object):
@staticmethod
def add(a, b):
return a + b
print(Test.add(1, 3))
>>> 执行结果如下:
>>> 4
接下来我们在上文的 Cat() 类基础演示一下 staticmethod 装饰器 (新建一个 color() 函数,使用 staticmethod 装饰器 )
class Cat(object):
def init(self, name):
self.name = name
def eat(self):
print(self.name, ‘喜欢吃鱼’)
self.work()
@classmethod
def work(cls):
print(‘会抓老鼠’)
@staticmethod
def color():
print(‘黄棕色’)
dragonLi = Cat(‘狸花猫’)
print(dragonLi.eat(), dragonLi.color())
>>> 执行结果如下:
>>> 狸花猫 喜欢吃鱼
>>> 会抓老鼠
>>> 黄棕色
>>> 从执行结果来看, staticmethod 装饰器的 color() 函数可以被实例化后的对象 dragonLi 调用。
>>> 那么可以被 Cat() 类 直接调用么?我们往下看
print(Cat.color())
>>> 执行结果如下:
>>> 黄棕色
>>> 可以看到,staticmethod 装饰器构造的 color() 函数,即使没有被实例化,依然可以直接被 类 调用
同样的,也尝试一下 staticmethod 装饰器构造的 color() 函数 是否能够在类函数中互相调用。
class Cat(object):
def init(self, name):
self.name = name
def eat(self):
print(self.name, ‘喜欢吃鱼’)
self.work()
self.color()
@classmethod
def work(cls):
print(‘会抓老鼠’)
@staticmethod
def color():
print(‘黄棕色’)
dragonLi = Cat(‘狸花猫’)
dragonLi.eat()
>>> 执行结果如下:
>>> 狸花猫 喜欢吃鱼
>>> 会抓老鼠
>>> 黄棕色
>>> 结合执行结果得出结论:staticmethod 装饰器构造的 color() 函数 可以在 eat() 类函数中被调用
与带有 classmethod 装饰器 的 函数 一样,staticmethod 装饰器构造的 函数也是无法调用普通的 带有 self 的函数的,这里就不再书写演示代码进行演示了。(staticmethod 装饰器构造的 函数也是无法调用普通的 带有 self 的函数会报错 : NameError: name 'self' is not defined
)
类的装饰器 - property
property 的功能:可以将类函数的执行免去小括号,类似于直接调用类的变量(属性)
staticmethod 的用法:参考如下
@property
def func(self):
todo
>>> 不能传入参数,无重要函数说明
示例如下
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)
hon开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
[外链图片转存中…(img-2ZHseBhm-1712543066590)]
[外链图片转存中…(img-JWCVZJTV-1712543066591)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)