• Python 进阶 之 @property


    @property是一个装饰器,由Python原生库所支持,无需import

    @property 的作用是将函数变成属性,一般作用于类内的成员函数。

    先贴个代码来描述一下@poperty存在的意义:

    >>> class Money(object):
    ...     def money(self):
    ...         return self.private_money
    ... 
    >>> a = Money()
    >>> a.money()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 3, in money
    AttributeError: 'Money' object has no attribute 'private_money'
    >>> a.private_money = 1000
    >>> a.money()
    1000
    >>> a.private_money = 10000
    >>> a.money()
    10000

    我们声明了一个类Money,该类有个money函数用来返回类实例的私有money。

    这个类正常使用没有什么问题,但有个隐患就是在调用money函数前是不知道类实例的当前私有money的值的,因为money的值实在太容易发生变化了,没有任何限制。做个惶恐的假设,这个money如果指的是老板发给员工的工资,老板岂不是要亏死了。。

    我们对该类做个改进,限制一下money的值

    >>> class Money(object):
    ...     def money(self):
    ...         if self.test_money > 2000 or self.test_money < 1000:
    ...             raise ValueError
    ...         else:
    ...             return self.test_money
    ... 
    >>> a = Money()
    >>> a.test_money = 1000
    >>> a.money()
    1000
    >>> a.test_money = 10000
    >>> a.money()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 4, in money
    ValueError

    现在能够限制Money的自由变化了,但是对于money的赋值和取值似乎有点麻烦了(赋值:a.test_money = 1000, 取值a.money),有没有一种方法既能实现变量值的限制,又能简化值的调用呢, 请看代码:

    >>> class Money(object):
    ...     @property
    ...     def money(self):
    ...         if self.test_money > 2000 or self.test_money < 1000:
    ...             raise ValueError
    ...         else:
    ...             return self.test_money
    ... 
    >>> a = Money()
    >>> a.test_money = 1000
    >>> a.money()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'int' object is not callable
    >>> a.money
    1000

    可以看到,@property已经将money函数变成了一个属性,在调用a.money()时会发生error,调用a.money时即可正常。似乎还是有点麻烦,私有money的赋值还是有点麻烦,根据鸭子定则,如何能把money函数真正变成一个“属性呢”,看下述代码:

    >>> a.money
    1000
    >>> class Money(object):
    ...     @property
    ...     def money(self):
    ...         if self.test_money > 2000 or self.test_money < 1000:
    ...             raise ValueError
    ...         else:
    ...             return self.test_money
    ...     @money.setter
    ...     def money(self, value):
    ...         self.test_money = value
    ... 
    >>> a = Money()
    >>> a.money = 1000
    >>> a.money
    1000

    money.setter重写了money属性的写权限,money.getter 可重写money属性的读权限,在此不再赘述

  • 相关阅读:
    iOS 新建xib文件时,最外层view的约束问题
    React native 无法弹出调试控件的问题
    从GitHub下载demo时遇到的依赖问题
    Mac 解决 Sourcetree 同步代码总需要密码的问题
    Mac 安装JRE 1.8
    正则表达式-- (.*?) 或 (.*+)
    字符串内有多个#号,每俩#号为一组,JavaScript 截取每组#号之间的字符
    Js/jQuery实时监听input输入框值变化
    Redis设置密码
    redis本机能访问 远程不能访问的问题
  • 原文地址:https://www.cnblogs.com/JansXin/p/7894777.html
Copyright © 2020-2023  润新知