zoukankan      html  css  js  c++  java
  • 内置装饰器二:@property

    property 装饰器的作用

    property 装饰器将方法包装成属性,将私有属性公有化,此属性只能被读取。相当于实现get方法的对象

    class People:
        def __init__(self, identity_number):
            self._identity_number = identity_number
    
        @property  # 只读
        def age(self):
            return self._age
    
        @age.setter  # 写
        def age(self, value):
            if not isinstance(value, int):
                raise ValueError("age must be an integer!")
            if value < 0:
                raise ValueError("age must more than 0")
            self._age = value
    
        @age.deleter  # 删除
        def age(self):
            del self._age
    
        @property
        def get_identity_number(self):
            return self._identity_number
        
    
    #In [22]: p = People(123456)
    
    #In [23]: p.age = 18
    
    # In [24]: p.age
    # Out[24]: 18
    
    # In [25]: del p.age
    
    # In [26]: p.age
    ---------------------------------------------------------------------------
    AttributeError                            Traceback (most recent call last)
    <ipython-input-26-3523b116dc0e> in <module>()
    ----> 1 p.age
    
    <ipython-input-21-de21f31a52ce> in age(self)
          5     @property  # 只读
          6     def age(self):
    ----> 7         return self._age
          8
          9     @age.setter  # 写
    
    AttributeError: 'People' object has no attribute '_age'
    
    # In [27]: p.age = 18
    
    # In [28]: p.age = 18.6
    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    <ipython-input-28-8a03211dcd49> in <module>()
    ----> 1 p.age = 18.6
    
    <ipython-input-21-de21f31a52ce> in age(self, value)
         10     def age(self, value):
         11         if not isinstance(value, int):
    ---> 12             raise ValueError("age must be an integer!")
         13         if value < 0:
         14             raise ValueError("age must more than 0")
    
    ValueError: age must be an integer!
    
    # In [29]: p.age = '11'
    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    <ipython-input-29-b6d20eff2848> in <module>()
    ----> 1 p.age = '11'
    
    <ipython-input-21-de21f31a52ce> in age(self, value)
         10     def age(self, value):
         11         if not isinstance(value, int):
    ---> 12             raise ValueError("age must be an integer!")
         13         if value < 0:
         14             raise ValueError("age must more than 0")
    
    ValueError: age must be an integer!
    
    # In [30]: p.age = -1
    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    <ipython-input-30-47db6d5817ed> in <module>()
    ----> 1 p.age = -1
    
    <ipython-input-21-de21f31a52ce> in age(self, value)
         12             raise ValueError("age must be an integer!")
         13         if value < 0:
    ---> 14             raise ValueError("age must more than 0")
         15         self._age = value
         16
    
    ValueError: age must more than 0
    
    # In [31]:
    
    

    会把成员函数x转换为getter,相当于做了x = property(); x = x.getter(x_get)

    • @property表示只读。
    • 同时有@property和@x.setter表示可读可写。
    • 同时有@property和@x.setter和@x.deleter表示可读可写可删除。

    参考资料:https://docs.python.org/3/library/functions.html?highlight=property#property

    http://blog.willdx.me/web/面向对象进阶.html

  • 相关阅读:
    查找算法
    顺序表和链表
    队列
    Redis系列教材 (二)- 运行
    Redis系列教材 (一)- windows教程
    Maven系列教材 (十三)- Eclipse 中创建父子-聚合项目
    Maven系列教材 (十一)- 使用Eclipse导入一个Maven风格的SSM项目
    Maven系列教材 (十)- 使用Eclipse创建一个Maven风格的SSM项目
    Maven系列教材 (九)- 在Eclipse中创建maven风格的java web项目
    Maven系列教材 (八)- 用命令行创建Maven风格的java web项目
  • 原文地址:https://www.cnblogs.com/ronky/p/9889449.html
Copyright © 2011-2022 走看看