雖然我們可以自由地給乙個例項繫結各種屬性,但是,現實世界中,一種型別的例項應該擁有相同名字的屬性。例如,person類應該在建立的時候就擁有name、gender和birth屬性,怎麼辦?
在定義 person 類時,可以為person類新增乙個特殊的__init__()方法,當建立例項時,__init__()方法被自動呼叫,我們就能在此為每個例項都統一加上以下屬性:
class person(object):__init__()方法的第乙個引數必須是self(也可以用別的名字,但建議使用習慣用法),後續引數則可以自由指定,和定義函式沒有任何區別。def __init__(self, name, gender, birth):
self.name = name
self.gender = gender
self.birth = birth
相應地,建立例項時,就必須要提供除self以外的引數:
xiaoming = person('xiao ming', 'male', '1991-1-1')有了__init__()方法,每個person例項在建立時,都會有name、gender和birth這3個屬性,並且,被賦予不同的屬性值,訪問屬性使用.操作符:xiaohong = person('xiao hong', 'female', '1992-2-2')
print xiaoming.name要特別注意的是,初學者定義__init__()方法常常忘記了 self 引數:# 輸出 'xiao ming'
print xiaohong.birth
# 輸出 '1992-2-2'
>>> class person(object):這會導致建立失敗或執行不正常,因為第乙個引數name被python直譯器傳入了例項的引用,從而導致整個方法的呼叫引數位置全部沒有對上。... def __init__(name, gender, birth):
... pass
...
>>> xiaoming = person('xiao ming', 'male', '1990-1-1')
traceback (most recent call last):
file "", line 1, in typeerror: __init__() takes exactly 3 arguments (4 given)
請定義person類的__init__方法,除了接受name、gender和birth外,還可接受任意關鍵字引數,並把他們都作為屬性賦值給例項。
?不會了怎麼辦
要定義關鍵字引數,使用**kw;
除了可以直接使用self.name = '***'設定乙個屬性外,還可以通過setattr(self, 'name', '***')設定屬性。
參考**:
class person(object):def __init__(self, name, gender, birth, **kw):
self.name = name
self.gender = gender
self.birth = birth
for k, v in kw.iteritems():
setattr(self, k, v)
xiaoming = person('xiao ming', 'male', '1990-1-1', job='student')
print xiaoming.name
print xiaoming.job
python 初始化例項屬性
雖然我們可以自由地給乙個例項繫結各種屬性,但是,現實世界中,一種型別的例項應該擁有相同名字的屬性。例如,person類應該在建立的時候就擁有 name gender 和 birth 屬性,怎麼辦?在定義 person 類時,可以為person類新增乙個特殊的 init 方法,當建立例項時,init ...
Python初始化例項屬性
雖然我們可以自由地給乙個例項繫結各種屬性,但是,現實世界中,一種型別的例項應該擁有相同名字的屬性。例如,person類應該在建立的時候就擁有name gender和birth屬性,怎麼辦?在定義 person 類時,可以為person類新增乙個特殊的 init 方法,當建立例項時,init 方法被自...
python之初始化例項屬性
對於例項來講,就同一種型別的例項,會擁有相同的屬性名稱,比如人person,需要有姓名name,性別gender,年齡age。因為python是動態語言,如果在定義例項時隨時給屬性賦值,例項多了會比較麻煩,那能不能事先把例項中的相同屬性的名稱定義好,在建立例項時直接賦值呢?可以。這就用到了pytho...