1. 程式人生 > >Python中的property特性屬性

Python中的property特性屬性

在Java中,我們將物件欄位定義為private欄位,這樣在呼叫過程中不能直接呼叫物件欄位,需要通過setter/getter進行讀取/賦值,保障了資料的安全性。

在Python中,通過property,使得不再需要setter/getter進行private物件欄位的包裝。Python約定成俗的規定是在private欄位前新增“_”/“__”。

 

private欄位變為只讀欄位:

class TestClass:

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

這裡定義了一個TestClass類,它有一個例項欄位_x,定了使用者傳來的x值,_x是private欄位,通過object._x訪問private欄位不符合語言規範,進而我們要將_x變為property(特性),通過object.x來訪問。

class TestClass(object):
    def __init__(self, x):
        self._x = x
        
    @property
    def x(self):
        return self._x
        
        
my = TestClass(20)

# 執行ok
print(my.x)


結果:
20

這裡能看到,對_x欄位進行了 property特性設定,進行只讀操作,如果要對_x欄位進行賦值該如何操作呢?

class TestClass(object):
    def __init__(self, x):
        self._x = x
        
    @property
    def x(self):
        return self._x
    
    # 賦值操作
    @x.setter
    def x(self, value):
        self._x = value
        
        
my = TestClass(20)
# 執行ok
print(my.x)

my.x = 30

print(my.x)

結果:
20
30

我們通常使用內建的@property裝飾器。但其實property是一個類,python中類和函式的呼叫方式都差不多,他們都是可呼叫物件
property的構造方法如下:

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

它最大接受4個引數,都可以為空。
第一個為getter,第二個為setter,第三個為delete函式,第四個為文件。

上述程式碼另一種寫法

class TestClass:

    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 = TestClass(10)
>>> obj.x
10