欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python 定義只讀屬性的實現(xiàn)方式

 更新時間:2020年03月05日 09:12:11   作者:Daniel2333  
這篇文章主要介紹了Python 定義只讀屬性的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

Python是面向對象(OOP)的語言, 而且在OOP這條路上比Java走得更徹底, 因為在Python里, 一切皆對象, 包括int, float等基本數(shù)據(jù)類型.

在Java里, 若要為一個類定義只讀的屬性, 只需要將目標屬性用private修飾, 然后只提供getter()而不提供setter(). 但Python沒有private關鍵字, 如何定義只讀屬性呢? 有兩種方法, 第一種跟Java類似, 通過定義私有屬性實現(xiàn). 第二種是通過__setattr__.

通過私有屬性

Python里定義私有屬性的方法見 http://www.dbjr.com.cn/article/181953.htm.

用私有屬性+@property定義只讀屬性, 需要預先定義好屬性名, 然后實現(xiàn)對應的getter方法.

class Vector2D(object):
 def __init__(self, x, y):
 self.__x = float(x)
 self.__y = float(y)

 @property
 def x(self):
 return self.__x
 @property
 def y(self):
 return self.__y

if __name__ == "__main__":
 v = Vector2D(3, 4)
 print(v.x, v.y)
 v.x = 8 # error will be raised.

輸出:

(3.0, 4.0)
Traceback (most recent call last):
 File ...., line 16, in <module>
 v.x = 8 # error will be raised.
AttributeError: can't set attribute

可以看出, 屬性x是可讀但不可寫的.

通過__setattr__

當我們調(diào)用obj.attr=value時發(fā)生了什么?

很簡單, 調(diào)用了obj的__setattr__方法. 可通過以下代碼驗證:

class MyCls():
 def __init__(self):
 pass

 def __setattr__(self, f, v):
 print 'setting %r = %r'%(f, v)
if __name__ == '__main__':
 obj = MyCls()
 obj.new_field = 1

輸出:

setting 'new_field' = 1

所以呢, 只需要在__setattr__ 方法里擋一下, 就可以阻止屬性值的設置, 可謂是釜底抽薪.

代碼:

# encoding=utf8
class MyCls(object):
 readonly_property = 'readonly_property' 
 def __init__(self):
 pass
 def __setattr__(self, f, v):
 if f == 'readonly_property':
  raise AttributeError('{}.{} is READ ONLY'.\
     format(type(self).__name__, f))

 else:
  self.__dict__[f] = v

if __name__ == '__main__':
 obj = MyCls()

 obj.any_other_property = 'any_other_property'
 print(obj.any_other_property)

 print(obj.readonly_property)
 obj.readonly_property = 1

輸出:

any_other_property
readonly_property
Traceback (most recent call last):
 File "...", line 21, in <module>
 obj.readonly_property = 1
 ...
 AttributeError: MyCls.readonly_property is READ ONLY

以上這篇Python 定義只讀屬性的實現(xiàn)方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • python 讀取視頻,處理后,實時計算幀數(shù)fps的方法

    python 讀取視頻,處理后,實時計算幀數(shù)fps的方法

    今天小編就為大家分享一篇python 讀取視頻,處理后,實時計算幀數(shù)fps的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Python迭代器與生成器基本用法分析

    Python迭代器與生成器基本用法分析

    這篇文章主要介紹了Python迭代器與生成器基本用法,結合實例形式分析了Python迭代器與生成器的基本功能、定義及使用方法,需要的朋友可以參考下
    2018-07-07
  • python的多線程原來可以這樣解

    python的多線程原來可以這樣解

    這篇文章主要為大家介紹了python的多線程,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Pytorch中torch.cat()函數(shù)舉例解析

    Pytorch中torch.cat()函數(shù)舉例解析

    一般torch.cat()是為了把多個tensor進行拼接而存在的,下面這篇文章主要給大家介紹了關于Pytorch中torch.cat()函數(shù)舉例解析的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • python實現(xiàn)異步回調(diào)機制代碼分享

    python實現(xiàn)異步回調(diào)機制代碼分享

    本文介紹了python實現(xiàn)異步回調(diào)機制的功能,大家參考使用吧
    2014-01-01
  • pandas中Timestamp類用法詳解

    pandas中Timestamp類用法詳解

    這篇文章主要為大家詳細介紹了pandas中Timestamp類用法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Python列表與元組的異同詳解

    Python列表與元組的異同詳解

    這篇文章主要介紹了Python列表與元組的異同詳解,“列表(list)與元組(tuple)兩種數(shù)據(jù)類型有哪些區(qū)別”這個問題在初級程序員面試中經(jīng)常碰到,超出面試官預期的答案往往能加不少印象分,也會給后續(xù)面試順利進行提供一定幫助,需要的朋友可以參考下
    2019-07-07
  • Python設計模式中的創(chuàng)建型工廠模式

    Python設計模式中的創(chuàng)建型工廠模式

    這篇文章主要介紹了Python設計模式中的創(chuàng)建型工廠模式,工廠模式即Factory?Pattern,是提供創(chuàng)建對象的最佳方式,下文小編介紹Python工廠模式的相關資料,需要的朋友可以參考一下
    2022-02-02
  • Python生成數(shù)字圖片代碼分享

    Python生成數(shù)字圖片代碼分享

    這篇文章主要介紹了Python生成數(shù)字圖片代碼分享,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • Python使用Pandas對csv文件進行數(shù)據(jù)處理的方法

    Python使用Pandas對csv文件進行數(shù)據(jù)處理的方法

    這篇文章主要介紹了Python使用Pandas對csv文件進行數(shù)據(jù)處理的方法,本文通過實例代碼相結合給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08

最新評論