知行编程网知行编程网  2022-11-21 13:30 知行编程网 隐藏边栏  6 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于Python中property特性属性是什么的相关知识,希望可以帮到处于编程学习途中的小伙伴

在Java中,类中定义的成员变量通常是私有变量。在类的实例中,不能直接操作对象和属性,而必须通过getters和setters来操作私有变量。

在Python中,因为有属性的概念,不需要写一堆重复的getter和setter代码来操作私有变量。 Python“私有变量”通常在变量前加“_”或“__”,如_attr或__attr,这是习惯规范。

Python中的property属性属性是什么


把私有属性变成只读特性

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

这里定义了一个MyClass类,它有一个实例变量_x,它绑定了用户传递的x值。 _x是私有变量,通过obj._x获取私有变量不符合语言规范,然后我们想把_x做成一个属性(特征),直接通过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。显然,只读方法不支持赋值。


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

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

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属性会覆盖instance属性!也可以理解为property属性的优先级更大!


property类解析

我们通常使用内置的@property 装饰器。但实际上,属性是一个类。 python中类和函数的调用方法类似,都是可调用对象。

property的构造方法如下:

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

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

第一个是 getter,第二个是 setter,第三个是删除函数,第四个是文档。

上述代码的另一种写法

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属性的解析。

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享