最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Python中property特性属性是什么

    正文概述    2020-05-23   412

    在Java中,通常在类中定义的成员变量为私有变量,在类的实例中不能直接通过对象.属性直接操作,而是要通过getter和setter来操作私有变量。

    而在Python中,因为有property这个概念,所以不需要写getter和setter一堆重复的代码来操作私有变量。Python“私有变量”通常在变量前加上“_”或者“__”,例如_attr或者__attr,这是约定俗成的规范。

    Python中property特性属性是什么

    把私有属性变成只读特性

    class MyClass:
        def __init__(self, x):
            self._x = x

    这里定义了一个MyClass类,它有一个实例变量_x,绑定了用户传来的x值。_x是私有变量,通过obj._x获取私有变量不符合语言规范,进而我们要使_x变成property(特性),通过obj.x直接访问。

    改造后的代码如下:

    class MyClass:
        def __init__(self, x):
            self._x = x
        @property
        def x(self):
            return self._x
        
    >>> obj = MyClass(10)
    >>> obj.x
    10

    我们把_x变成了property特性,以只读的方式获取x的值。

    我们现在想为x赋值该怎样做呢?

    >>> obj.x = 999
    Traceback (most recent call last):
      File "xxx", line 14, in <module>
        obj.x = 23
    AttributeError: can't set attribute

    可以看到,抛出了AttributeError: can't set attribute。显然,只读方法不支持赋值。

    相关推荐:《Python视频教程》

    把私有变量变成可赋值的特性

    我们只需要在上述代码改造成:

    class MyClass:
        def __init__(self, x):
            self._x = x
        @property
        def x(self):
            return self._x
        
        @x.setter
        def x(self, value):
            self._x = value
    >>> obj = MyClass(10)
    >>> obj.x = 999
    >>> obj.x
    999

    可以看到,我们为x添加了setter,可以直接为obj.x赋值操作。

    property属性能够遮盖实例属性

    继续上面的代码,我们看看以下的操作:

    >>> obj = MyClass(10)
    >>> obj.__dict__
    {'_x': 999}  #此时实例变量中有_x的值
    >>> obj.__dict__['x'] = 99999  #设置obj的实例变量有x值,跟property属性重名!
    >>> obj.__dict__
    {'_x': 999, 'x': 99999}  #此时实例变量中有_x和x的值
    >>> obj.x     #结果是obj的实例变量还是property属性?
    10

    如上代码所示,obj对象有一个_x实例变量和一个x的property属性,我们又强行为obj增加了一个x实例变量,这个实例变量x和property属性x同名!

    通过obj.x我们得知,返回的是property属性,说明property属性会遮盖实例属性!也可以理解为property属性的优先级更大!

    property类解析

    我们通常使用内置的@property装饰器。但其实property是一个类,python中类和函数的调用方式都差不多,他们都是可调用对象。

    property的构造方法如下:

    class property(object):
        def __init__(self, fget=None, fset=None, fdel=None, doc=None):
            """"""

    它最大接受4个参数,都可以为空。

    第一个为getter,第二个为setter,第三个为delete函数,第四个为文档。

    上述代码的另一种写法

    class MyClass:
        def __init__(self, x):
            self._x = x
        def get_x(self):
            return self._x
        def set_x(self, value):
            self._x = value
        x = property(get_x, set_x)
    >>> obj = MyClass(10)
    >>> obj.x
    10

    如上,x是property的实例,设置了getter和setter,作为类变量放在MyClass类中。

    以上就是property属性的解析。


    起源地下载网 » Python中property特性属性是什么

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元