python中的@property装饰器

1. property

摘抄自https://blog.youkuaiyun.com/qq_41359051/article/details/82939655

  1. 定义类的函数时,在函数上方加@property
  • 它的作用是:将方法变成属性调用
class Stranger(object):
    def __init__(self, gender=None, age=None, job=None):
        self.gender = gender
        self._age = age # 这里的成员属性_age需要与成员方法age()区分开
        self.jobb = job

    # 读取age
    @property # 实现一个age相关的getter方法
    def age(self):
        return self._age

    # 设置age
    @age.setter # 实现一个age相关的setter方法
    def age(self, value):
        if isinstance(value, int):
            self._age = value
        else:
            raise ValueError("'int' type need")
            

if __name__ == "__main__":
    # 创建一个“妹子”
    meizi = Stranger()

    meizi.age = 18  # 使用时注意是.age,不是._age
    print("年龄:{age}".format(age=meizi.age))

# 输出:
#年龄:18

注意事项

  1. 属性名与方法名一定要区分开,不然会进入死循环(self._age,def age())
  2. 实例化的对象使用属性时,不是调用属性(meizi._age),而是用的方法名(meizi.age)
  3. @property其实就是实现了getter功能; @xxx.setter实现的是setter功能;还有一个 @xxx.deleter实现删除功能
  4. 定义方法的时候 @property必须在 @xxx.setter之前,且二者修饰的方法名相同(age())
  5. 如果只实现了 @property(而没有实现@xxx.setter),那么该属性为 只读属性

2. python装饰器 – 修饰函数

python装饰器
使用from functools import wraps,让func.__name__变成调用的func的名称而不是装饰函数的名称

from functools import wraps
 
def a_new_decorator(a_func):
    @wraps(a_func)
    def wrapTheFunction():
        print("I am doing some boring work before executing a_func()")
        a_func()
        print("I am doing some boring work after executing a_func()")
    return wrapTheFunction
 
@a_new_decorator
def a_function_requiring_decoration():
    """Hey yo! Decorate me!"""
    print("I am the function which needs some decoration to "
          "remove my foul smell")
 
print(a_function_requiring_decoration.__name__)
# Output: a_function_requiring_decoration

使用模板

from functools import wraps
def auth(func):
	@wraps(func)
    def wrapper(*args, **kwargs):
        # 1、调用原函数
        # 2、为其增加新功能
        name = input('your name>>: ').strip()
        pwd = input('your password>>: ').strip()
        if name == 'egon' and pwd == '123':
            res = func(*args, **kwargs)
            return res
        else:
            print('账号密码错误')

    return wrapper


@auth
def index():
    print('from index')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值