補上篇:
定義實例:
實例名 = 類名.(除了self以外的所有參數(shù))
def __init__
中設(shè)置的參數(shù)都是在定義實例的時候輸入的盖腕,因此算作實例的屬性
定義類屬性:直接在class
下面輸入如 name = 'student'
然后類中所有的實例均可以調(diào)用類屬性 實例名.類屬性名
也可以直接用類來調(diào)用 類名.類屬性名
由于實例屬性優(yōu)先級比類屬性高我纪,因此,定義了實力屬性以后會覆蓋類屬性
但是當(dāng)你刪除實例屬性后汹想,再使用相同的名稱,訪問到的將是類屬性。
(如何刪除撒汉?轿钠?)
調(diào)用屬性:
>>> class a(object):
... def __init__(self,name):
... self.name = name
...
>>> lalala = a(la)
Traceback (most recent call last): File "<stdin>", line 1, in <module>NameError: name 'la' is not defined```
`__init__`中的`name`等屬性系統(tǒng)有自動的識別巢钓,輸入必須是str類型
-----
查看數(shù)據(jù)類型:`type(a)`,此時顯示的都是**最小的子類**
但其實通過繼承疗垛,也屬于所有的父類症汹,所以可以用`isinstance(a,type)`來判斷
類似`__xxx__`的屬性和方法在Python中都是有特殊用途的,比如`__len__`方法返回長度贷腕。
在Python中烈菌,如果你調(diào)用`len()`函數(shù)試圖獲取一個對象的長度阵幸,實際上,在len()函數(shù)內(nèi)部芽世,它定義了去調(diào)用該對象的`__len__()`方法挚赊。
**對某些函數(shù)理解:**
函數(shù)len()的定義內(nèi)部調(diào)用`__len__`,如果你的類內(nèi)部沒有`__len__`方法济瓢,則不可以使用`len()`調(diào)用類荠割,你也可以為自己的函數(shù)內(nèi)部定義一個`__len__`方法,然后使用`len()`函數(shù)后會調(diào)用你定義的方法旺矾。
-------
hasattr(obj, 'x') # 有屬性'x'嗎蔑鹦?
getattr(obj, 'x') #獲得屬性'x'
setattr(obj, 'y',值) # 設(shè)置一個屬性'y'
屬性名一定是string類型
`getattr()`在已知如何直接調(diào)用函數(shù)內(nèi)部屬性的情況下不需要這樣寫,如
`obj.x`
如果試圖獲取不存在的屬性箕宙,會拋出AttributeError的錯誤:
getattr(obj, 'z')
Traceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: 'MyObject' object has no attribute ‘z’
可以傳入一個default參數(shù)嚎朽,如果屬性不存在,就返回默認(rèn)值:
getattr(obj, 'z', 404) # 獲取屬性'z'柬帕,如果不存在哟忍,返回默認(rèn)值404```