Python零基础入门篇 - 36 - 装饰器与类的装饰器

本文详细介绍了Python中的类装饰器classmethod、staticmethod和property的用法,包括它们的功能、使用示例以及相互之间的调用关系。着重展示了如何区分并正确使用这些装饰器来控制类函数的调用方式。
摘要由CSDN通过智能技术生成

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

>>> 不能传入参数,无重要函数说明

示例如下

class Test(object):

def init(self, name):

self.name = name

@property

def call_name(self):

return ‘Hello {}’.format(self.name)

test = Test(‘Neo’)

result = test.call_name # 不需要添加 小括号 即可调用 call_name 函数;

关于 staticmethod 不可传入参数,其实并不是不可以传入参数,而是传入的方法比较另类,我们继续往下看

print(result)

>>> 执行结果如下:

>>> Hello Neo

重新创建一个 Dog 类 ,然后我们继续演示。

class Dog(object):

def init(self, name):

self.__name = name

@property

def type(self):

if self.__name in [‘哈士奇’, ‘萨摩耶’, ‘阿拉斯基’]:

return self.__name, '是雪橇犬,‘雪橇三傻’之一’

elif self.__name in [‘吉娃娃’, ‘博美犬’, ‘约克夏’]:

return self.__name, ‘是小型犬’

else:

return self.__name, ‘我暂时不知道这是什么犬种,也许它是’泰日天’的亲戚’

dog = Dog(name=‘哈士奇’)

print(dog.type) # 这里我们并不需要 dog.type + () 小括号,即可调用 type() 函数

>>> 执行结果如下:

>>> (‘哈士奇’, “是雪橇犬,'雪橇三傻’之一”)

>>> 这里我们看到 当 Dog 类 实例化 dog 变量之后,我们传入的 ‘哈士奇’ 参数是不可更改的,如果我们尝试利用赋值的方式修改传入的参数呢?

dog = Dog(name=‘哈士奇’)

dog.type = ‘约克夏’

print(dog.type)

>>> 执行结果如下:

>>> AttributeError: can’t set attribute

>>> 报错:属性错误,不可以设置这个属性

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
img

最后

Python崛起并且风靡,因为优点多、应用领域广、被大牛们认可。学习 Python 门槛很低,但它的晋级路线很多,通过它你能进入机器学习、数据挖掘、大数据,CS等更加高级的领域。Python可以做网络应用,可以做科学计算,数据分析,可以做网络爬虫,可以做机器学习、自然语言处理、可以写游戏、可以做桌面应用…Python可以做的很多,你需要学好基础,再选择明确的方向。这里给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

👉Python所有方向的学习路线👈

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

👉Python必备开发工具👈

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

👉Python全套学习视频👈

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

👉实战案例👈

学python就与学数学一样,是不能只看书不做题的,直接看步骤和答案会让人误以为自己全都掌握了,但是碰到生题的时候还是会一筹莫展。

因此在学习python的过程中一定要记得多动手写代码,教程只需要看一两遍即可。

👉大厂面试真题👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

👉Python全套学习视频👈

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

👉实战案例👈

学python就与学数学一样,是不能只看书不做题的,直接看步骤和答案会让人误以为自己全都掌握了,但是碰到生题的时候还是会一筹莫展。

因此在学习python的过程中一定要记得多动手写代码,教程只需要看一两遍即可。

👉大厂面试真题👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

  • 22
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值