zoukankan      html  css  js  c++  java
  • (转)Python内置函数进阶之“属性(property())”详解

    原文:https://blog.csdn.net/GeekLeee/article/details/78519767

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/GeekLeee/article/details/78519767
    属性函数(property)有以下作用:
    - 将类方法转换为只读属性
    - 重新实现一个属性的setter和getter方法

    将类方法转换为只读属性
    class Person(object):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, first_name, last_name):
    """Constructor"""
    self.first_name = first_name
    self.last_name = last_name

    #----------------------------------------------------------------------
    @property
    def full_name(self):
    """
    Return the full name
    """
    return "%s %s" % (self.first_name, self.last_name)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    以上创建了
    两个类属性:self.first_name和self.last_name
    一个full_name方法
    调用full_name方法为person.full_name(),用@property变为person.full_name


    >>> person = Person("Mike", "Driscoll")
    >>> person.full_name
    'Mike Driscoll'
    >>> person.first_name
    'Mike'
    >>> person.full_name = "Jackalope"
    Traceback (most recent call last):
    File "<string>", line 1, in <fragment>
    AttributeError: can't set attribute
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    但他只具有只读属性,不能更改
    Python进阶之“属性(property)”详解
    Python 中的 property 属性

    两个等同的代码:

    class Foo:
    def __init__(self,val):
    self.__NAME=val #将所有的数据属性都隐藏起来

    @property #get
    def name(self):
    return self.__NAME #obj.name访问的是self.__NAME(这也是真实值的存放位置)

    @name.setter #set
    def name(self,value):
    if not isinstance(value,str): #在设定值之前进行类型检查
    raise TypeError('%s must be str' %value)
    self.__NAME=value #通过类型检查后,将值value存放到真实的位置self.__NAME

    @name.deleter #delete
    def name(self):
    raise TypeError('Can not delete')

    f=Foo('egon')
    print(f.name)
    # f.name=10 #抛出异常'TypeError: 10 must be str'
    del f.name #抛出异常'TypeError: Can not delete'
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    class Foo:
    def __init__(self,val):
    self.__NAME=val #将所有的数据属性都隐藏起来

    def getname(self): #get
    return self.__NAME #obj.name访问的是self.__NAME(这也是真实值的存放位置)

    def setname(self,value): #set
    if not isinstance(value,str): #在设定值之前进行类型检查
    raise TypeError('%s must be str' %value)
    self.__NAME=value #通过类型检查后,将值value存放到真实的位置self.__NAME

    def delname(self): #delete
    raise TypeError('Can not delete')

    name=property(getname,setname,delname) #最后把方法变成属性

    #一种property的古老用法
    ---------------------
    作者:GeekLeee
    来源:CSDN
    原文:https://blog.csdn.net/GeekLeee/article/details/78519767
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    Java算法之 二分搜寻法 ( 搜寻原则的代表)
    Java算法之 二分搜寻法 ( 搜寻原则的代表)
    基本选择器示例 改变颜色
    jquery 2.3.1 基本选择器
    ModelMapper:从对象到对象的映射库
    老司机带你在MySQL领域“大吉大利,晚上吃鸡”
    jquery getElementById
    jquery getElementsByName
    根据id获取元素
    win10能点开开始菜单但是不能点里面的功能
  • 原文地址:https://www.cnblogs.com/liujiacai/p/10042907.html
Copyright © 2011-2022 走看看