首页 > 编程语言 >python内置装饰器

python内置装饰器

时间:2023-02-20 19:22:06浏览次数:46  
标签:xiaoMing 内置 python money age self def 装饰 Bank

python有三个内置装饰器:@property , @classmethod , @staticmethod

(一)@property

这是用来修饰类的方法的,可以把类的方法变成可直接读/写的属性  相当于get和set方法

我们看看下面这个例子

class Person(object):
def __init__(self, name, age):
self.name = name
self._age = age

def get_age(self):
return self._age
def set_age(self, age):
self._age = age
def __call__(self):
print('姓名:{},年龄:{}'.format(self.name,self._age))

xiaoMing = Person('小明', 20)
xiaoMing()
xiaoMing.set_age(160)
xiaoMing()


# 输出结果是
姓名:小明,年龄:20
姓名:小明,年龄:160

这里我们定义了一个Person的类,有姓名和年龄两个属性,然后我们希望年龄是可以改的,其中_age是私有参数,我们不希望外界可以直接修改这个属性,所以我们给类声明了age的get和set方法。但是这样写麻烦了,每次读age的时候都需要调用get_age函数,修改age的时候都需要调用set_age函数,我们希望可以像访问普通的属性一样可以直接 实例,属性 就可以访问到和修改,这时候@property装饰器就可以派上用场了,它可以将类的方法变成属性来访问。

我们修改一下代码:

class Person(object):
def __init__(self, name, age):
self.name = name
self._age = age

@property
def age(self):
return self._age

@age.setter
def age(self, age):
if age > 100:
raise ValueError('年龄太大啦')
if age < 0:
raise ValueError('年龄太小啦')
self._age = age

def __call__(self):
print('姓名:{},年龄:{}'.format(self.name,self._age))

xiaoMing = Person('小明', 20)
xiaoMing()
xiaoMing.age = 160
xiaoMing()

 

这里运行报错了,因为我们给age赋值160,超出了我们的范围,所以抛了一个异常,输出如下:

姓名:小明,年龄:20
Traceback (most recent call last):
File "c:\Users\10541\Desktop\epa-project\decorator.py", line 23, in <module>
xiaoMing.age = 160
File "c:\Users\10541\Desktop\epa-project\decorator.py", line 13, in age
raise ValueError('年龄太大啦')
ValueError: 年龄太大啦

如此我们就可以既保护了私有属性_age,又可以直接以属性的方式直接访问我们的age

如果我们只写@property, 不写setter的话,这个属性是个只读的属性,不可以修改。

class Person(object):
def __init__(self, name, age):
self.name = name
self._age = age

@property
def age(self):
return self._age

# @age.setter
# def age(self, age):
# if age > 100:
# raise ValueError('年龄太大啦')
# if age < 0:
# raise ValueError('年龄太小啦')
# self._age = age

def __call__(self):
print('姓名:{},年龄:{}'.format(self.name,self._age))

xiaoMing = Person('小明', 20)
xiaoMing()
xiaoMing.age = 160
xiaoMing()

 

运行结果如下:

姓名:小明,年龄:20
Traceback (most recent call last):
File "c:\Users\10541\Desktop\epa-project\decorator.py", line 23, in <module>
xiaoMing.age = 160
AttributeError: can't set attribute

(二)@classmethod

一般情况下,我们要使用某个类的方法的话,需要先实例化一个对象,再由对象调用我们的方法,,而使用@classmethod去修饰我们的类方法的话,则可以直接通过 类名.方法 来调用我们的方法,不需要实例对象

代码如下:

 

class Bank(object):
money = 0
def addMoney(self, num):
Bank.money += num
def reduceMoney(self, num):
Bank.money -= num

@classmethod
def bankMoney(cls):
print('bank money is %d' % cls.money)

userA = Bank()
userB = Bank()
userA.addMoney(100)
Bank.bankMoney()
userB.reduceMoney(20)
Bank.bankMoney()

 

输出如下:

bank money is 100
bank money is 80

在场景中Bank是银行,然后money属性是银行里边的总共的钱,userA和userB是用户,分别往里边存钱和取钱了,money是Bank的公共属性,我们希望可有个方法,直接Bank调用来打印出money的值,通过@classmethod修饰器的方法,可以直接用类名调用

第一个参数cls是类本身,可以通过cls调用类的属性或方法

(三) @staticmethod

@staticmethod的作用和@classmethod的作用类似,都是给类的方法修饰之后,就可以直接使用类名.方法名调用,区别是@staticmethod修饰的方法中没有cls参数

class Bank(object):
money = 0
def addMoney(self, num):
Bank.money += num
def reduceMoney(self, num):
Bank.money -= num

@staticmethod
def bankMoney():
print('bank money is %d' % Bank.money)

userA = Bank()
userB = Bank()
userA.addMoney(100)
Bank.bankMoney()
userB.reduceMoney(20)
Bank.bankMoney()

运行结果同上

标签:xiaoMing,内置,python,money,age,self,def,装饰,Bank
From: https://www.cnblogs.com/zuochuang/p/17138590.html

相关文章

  • 数据类型-字符串-内置方法
    一、定义在单引号\双引号\三引号内包含一串字符name1='jason' #本质:name=str('任意形式内容')name2="lili" #本质:name=str("任意形式内容")name3=......
  • 装饰器
    装饰器装饰器(Decorators)是Python的一个重要部分。简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短,也更Pythonic(Python范儿)。大多数初学者不知道......
  • Python 学习02 内置数据类型
    ......
  • Yum系列系统升级python版本
    问题描述系统可能携带的是python3.6,而自动化开发基线是python3.7就会导致部分包无法使用等问题升级python3.7查看当前系统python版本ls-al/usr/bin|greppython......
  • PYTHON将图片插入到excel
    一、案例1:insert_imageimportxlsxwriterbook=xlsxwriter.Workbook('E:\\test.xlsx')sheet=book.add_worksheet('demo')sheet.insert_image('D4','E:\\001.jpg')b......
  • python如何读取excel表数据
    @目录python读取excel表数据的方法:完整的程序代码python读取excel表数据的方法:首先安装Excel读取数据的库xlrd;然后获取Excel文件的位置并且读取进来;接着读取指定的行和列......
  • python 装饰器示例
    1defwrapper_log(func):2"""3无参装饰器,也可以写成有参装饰器,True或Flase标记是否调用日志模块4功能一:执行失败,打印并记录错误日志信息,定位bug......
  • python--matplotlib(2)
    前言 Matplotlib画图工具的官网地址是http://matplotlib.org/Python环境下实现Matlab制图功能的第三方库,需要numpy库的支持,支持用户方便设计出二维、三维数据的图形显示,制......
  • python之路73 vue框架 vue-cli创建项目、vue项目目录介绍、es6导入导出语法、登录功
    vue-cli创建项目前端做成项目---》使用工具(vue-cli),创建vue项目,单页面应用(spa),组件开发,把xx.vue,ts,saas,less---》编译---》在浏览器中执行vue-cli创建项目开发,在项......
  • python 获取b站 个人关注列表用户信息
    前言本程序是get_bili_medal_list项目的一个子程序,用于获取个人关注列表用户信息。整体很简单,没啥东西,主要是辅助作用。数据获取完毕后,存储于data/follows.json(提前......