雖然我們可以自由地給一個實例綁定各種屬性,但是,現實世界中,一種類型的實例應該擁有相同名字的屬性。例如,Person類應該在創建的時候就擁有 name、gender 和 birth 屬性,怎么辦? 在定義 Person 類時,可以為Person類添加一個特殊的__init__()方法,當創建實例時,__init__()方法被自動調用,我們就能在此為每個實例都統一加上以下屬性: class Person(object): def __init__(self, name, gender, birth): self.name = name self.gender = gender self.birth = birth __init__() 方法的第一個參數必須是 self(也可以用別的名字,但建議使用習慣用法),后續參數則可以自由指定,和定義函數沒有任何區別。 相應地,創建實例時,就必須要提供除 self 以外的參數: xiaoming = Person('Xiao Ming', 'Male', '1991-1-1') xiaohong = Person('Xiao Hong', 'Female', '1992-2-2') 有了__init__()方法,每個Person實例在創建時,都會有 name、gender 和 birth 這3個屬性,並且,被賦予不同的屬性值,訪問屬性使用.操作符: print xiaoming.name # 輸出 'Xiao Ming' print xiaohong.birth # 輸出 '1992-2-2' 要特別注意的是,初學者定義__init__()方法常常忘記了 self 參數: >>> class Person(object): ... def __init__(name, gender, birth): ... pass ... >>> xiaoming = Person('Xiao Ming', 'Male', '1990-1-1') Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: __init__() takes exactly 3 arguments (4 given) 這會導致創建失敗或運行不正常,因為第一個參數name被Python解釋器傳入了實例的引用,從而導致整個方法的調用參數位置全部沒有對上。 任務 請定義Person類的__init__方法,除了接受 name、gender 和 birth 外,還可接受任意關鍵字參數,並把他們都作為屬性賦值給實例。 ?不會了怎么辦 要定義關鍵字參數,使用 **kw; 除了可以直接使用self.name = 'xxx'設置一個屬性外,還可以通過 setattr(self, 'name', 'xxx') 設置屬性。 參考代碼: 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