簡體   English   中英

在Python中封裝實例字段的方法

[英]Way to encapsulate instance fields in Python

@property裝飾器的這種使用是否適合獲得實例字段的良好封裝? 我試圖實現Foobar類的客戶端不能以任何方式向Foobar實例的字段vel分配任意值,事實上繞過了在屬性setter方法中定義的分配規則。

謝謝。

class Foobar(object):
    def __init__(self):
        self._vel = 0

    @property
    def vel(self):
        return self._vel

    @vel.setter
    def vel(self, v):
        self._vel = v if v > 0 else 0

該字段似乎封裝良好。

>>> foobar = Foobar()
>>> foobar.vel
0
>>> foobar.vel = -1
>>> foobar.vel
0
>>> foobar.vel = 1
>>> foobar.vel
1

您不能阻止用戶繞過python中的任何內容。 總是有一種方法來進行猴子補丁/反射/檢查屬性。 沒有對象沙箱支持。

在您的示例中:

>>> foobar._vel = -1

將完全繞過該屬性並直接分配給real屬性。 您根本無法阻止它。 有一些方法可以使工作變得更困難,但是用戶可以根據自己的意願進行分配,這又意味着什么呢?

通常的方法似乎是基於您的圖書館的用戶是成年人並信任他們的事實:

在文檔中聲明期望值的范圍,並要求用戶遵循。 如果他們不這樣做,那是他們的錯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM