1. 程式人生 > >python 類中__slots__ 和 @property

python 類中__slots__ 和 @property

  1. slots 
將字串屬性名稱順序賦值給特殊的__slots__類屬性,就可以限制類的例項將有的合法屬性集。這個比較簡單,例如:
>>> class people(object):
...     __slots__ = ['age', 'name’]
限制了people只有age和name的屬性。對比下就知道了。
>>> class all(object):
…     pass

>>> a = people()
>>> b = all()
>>>
>>> a.age = 1
>>> a.age
1
>>> b.age = 2
>>> b.age
2
>>>
>>> a.gender = 'male'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'people' object has no attribute 'gender'
>>> b.gender = 'male'
>>> b.gender
'male'
先對age賦值,a,b都正常,在對性別賦值,a直接報錯,因為people加了__slots__限制,只能有age和name例項屬性。為啥要用__slots__呢?效能問題。使用__slots__是有副作用的
1. 每個繼承的子類都要重新定義一遍__slots__
2. 例項只能包含哪些在__slots__定義的屬性,這對寫程式的靈活性有影響,比如你由於某個原因新網給instance設定一個新的屬性,比如instance.a = 1, 但是由於a不在__slots__裡面就直接報錯了,你得不斷地去修改__slots__或者用其他方法迂迴的解決
所以例項不超過萬級別的類,__slots__是不太值得使用的,麻煩啊,還有就是不利於別人閱讀你的程式碼,並不一定pythoner都知道這個屬性啊,還得害人家google瞭解一下。PS:《fluent python》比我狠,說的是小於百萬級別例項不值得使用。

2.property 

在繫結屬性時,如果我們直接把屬性暴露出去,雖然寫起來很簡單,但是,沒辦法檢查引數,導致可以把成績隨便改:class Student(object):    passs = Student()s.score = -1這其實很不合理,我們需要對score引數做檢查,class Student(object):    def get_score(self):        return self._score    def set_score(self, value):        if not isinstance(value, int):            raise ValueError('score must be an integer!')        if
value < 0 or value > 100:            raise ValueError('score must between 0 ~ 100!')        self._score = value現在,對任意的Student例項進行操作,就不能隨心所欲地設定score了:>>> s = Student()>>> s.set_score(60) # ok!>>> s.get_score()60>>> s.set_score(9999)Traceback (most recent call last):  ...ValueError: score must between 0 ~ 100!但是其實挺麻煩的,python的思想是簡單。Python內建的@property裝飾器就是負責把一個方法變成屬性呼叫的class Student(object):    @property    def score(self):        return self._score    @score.setter    def score(self, value):        if not isinstance(value, int):            raise ValueError('score must be an integer!')        if value < 0 or value > 100:            raise ValueError('score must between 0 ~ 100!')        self._score = value@property的實現比較複雜,我們先考察如何使用。把一個getter方法變成屬性,只需要加上@property就可以了,此時,@property本身又建立了另一個裝飾器@score.setter,負責把一個setter方法變成屬性賦值,於是,我們就擁有一個可控的屬性操作。Python內建的@property裝飾器就是負責把一個方法變成屬性呼叫的,將屬性變成不可更改。

相關推薦

python __slots__  @property

slots 將字串屬性名稱順序賦值給特殊的__slots__類屬性,就可以限制類的例項將有的合法屬性集。這個比較簡單,例如:>>> class people(object): ... __slots__ = ['age', 'name’]限制了peo

【轉】pythonsuper()__init__()的區別

【轉】python類中super()和__init__()的區別 單繼承時super()和__init__()實現的功能是類似的 class Base(object): def __init__(self): print 'Base create' class child

python學習(五):Pythonsuper()__init__()的關係

1.單繼承時super()和__init__()實現的功能是類似的 class Base(object): def __init__(self): print 'Base create' class childA(Base): def __init__(sel

python 變數 區域性變數全域性變數

1.類中初始化變數 class dig():     def __init__(self,x,y):         self.x=x         self.y=y     def pd(self

@propertypython的應用

bject ack style 註意 log 一個 sel 變量 obj 1.在類中,有時需要限制輸入的內容,可以用一個set來輸入需要的內容,用get來取得輸入的內容 2.其實說白,上述所說的方法就是用來檢查輸入內容,讓人們不能隨心所欲的設置了。 參見下面的例子: 1

python的self參數cls參數

ini ls參數 普通 直接 CM 更多 class pytho IV 1. self表示一個類的實例對象本身。如果用了staticmethod就無視這個self了,就將這個方法當成一個普通的函數使用了。 2. cls表是這個類本身。 # 代碼為證 class A

Python的單下劃線雙下劃線的區別

#"單下劃線" 開始的成員變數叫做保護變數,意思是隻有類物件和子類物件自己能訪問到這些變數; #"雙下劃線" 開始的是私有成員,意思是隻有類物件自己能訪問,連子類物件也不能訪問到 #-*-coding:utf8-*- class father(): def __init

python __slots__@property

前面瞭解了python的面向物件的基本方式https://blog.csdn.net/qq_21294095/article/details/85118247 心中有挺多的疑問,而解決這些疑問就需要用到python更強大的功能了 一,動態繫結這個事兒太隨意了,怎麼限制? __slot

Python的"私有欄位""私有屬性"

@staticmethod def Forward(): print u'開始向前進'#coding:utf-8 class Car: # 下面是靜態欄位 memo = u'車輛具有出廠合格證' def __init__(self, brand, model, sp

Python的屬性方法總結

類中的屬性分為: 例項屬性 類屬性 類中的方法分為: 例項方法 類方法 靜態方法 類中的屬性 例項屬性: 定義:在類的方法中定義的變數 使用:建立例項物件的時候被建立,能被例項呼叫,無法被類呼叫,可以

python的self引數cls引數

1. self表示一個類的例項物件本身。如果用了staticmethod就無視這個self了,就將這個方法當成一個普通的函式使用了。2. cls表是這個類本身。# 程式碼為證 class A(object): def func1(self): prin

Python——詳解__slots__property私有方法

本文始發於個人公眾號:TechFlow,原創不易,求個關注 今天是Python專題的第11篇文章,我們來聊聊面向物件的一些進階使用。 __slots__ 如果你看過github當中一些大牛的程式碼,你會發現很多大牛經常在類的頂部加上__slots__關鍵字。如果你足夠好奇,你可能會試著把這個關鍵字去掉再執行

Python反射的作用

屬性 cnblogs argv 字符串 實現 span div init asa #coding:utf-8 ‘‘‘ #反射的基本用法: hasattr 判斷一個方法是否存在於實例中 getattr 指定一個方法名字,獲取該方法的內存地址,加"()"括號並可執行 ‘‘‘

Java sannernextnextLine的區別

浮點 驗證 courier 判斷 回車 nbsp () oid 輸入 next() 與 nextLine() 區別 next(): 1、一定要讀取到有效字符後才可以結束輸入。 2、對輸入有效字符之前遇到的空白,next() 方法會自動將其去掉。 3、只有輸入有效字符後才將其

angular2 標簽attributeproperty

指令 例如 angular 需要 隨著 100% 異同 order rop 原鏈接:http://blog.csdn.net/erciyuan_nuonuo/article/details/60971696 property:dom元素作為對象附加的內容,例如childN

python的屬性方法總結

python一、類的屬性總結(類的屬性定義在方法外,對象的屬性定義在方法內)理解:類的(靜態)屬性:(人類的五官,理解為變量)類的(動態)方法:(人類吃穿住行,理解為一個函數,至少帶一個參數self,指向類本身)對象:類的實例化,之後才能有屬性和方法1)類的屬性,也是公有屬性;類的私有屬性2)對象的公有屬性;

python 對象實例對象動態添加方法

sta body elf import cme sel odt ssm gpo 1 class Person(): 2 def __init__(self, name): 3 self.name = name 4 5 6 def p

Python的繼承方法重寫總結

python 類繼承和重寫 Python類的繼承和方法重寫總結 我們都知道類可以繼承,通過繼承可以實現代碼的復用,使代碼看起來更加簡潔 比如:Class B(A): Pass 定義了一個名為B的類,它繼承於A,我們把B叫做A的子類,A叫做B的超類(父類)。 方法重寫當子類定義了一個和超類相同名字的方

python的一些神奇方法

strong style self. 返回 test int error: turn 引用 __str__:用於在print(對象)時,直接打印__str__的返回值 1 class Animal: 2 def __init__(self, name): 3

python的雙下劃線方法

att 他還 ret sel col 只有一個 war span instance   __getitem__,__setitem__和__delitem__   實現了對象屬性的字典化操作。 class Person: def __init__(self, na