通過前面的方式定義一個實例的屬性非常方便,但也有一些問題。
首先,如果定義屬性的過程中使用了不同的屬性名字,比如性別,前者使用了sex,后者使用了gender,那對于一個類的不同實例,存儲一個信息就用了兩個不同的屬性,在后面將會難以維護。
其次,名字、性別、年齡等等,都是人的基本信息,在抽象一個類的時候,理應包含這些信息。
在定義 Person 類時,可以為Person類添加一個特殊的__init__()方法,當創建實例時,__init__()方法被自動調用,我們就能在此為每個實例都統一加上以下屬性:
class Person(object): def __init__(self, name, sex, age): self.name = name self.sex = sex self.age = age
需要注意的是,__init__() 方法的第一個參數必須是 self(也可以用別的名字,但建議使用習慣用法),后續參數則可以自由指定,和定義函數沒有任何區別。
定義類后,就可以相應的實例化對象了,需要注意的是,在實例化的時候,需要提供除self以外的所有參數。
xiaoming = Person('Xiao Ming', 'boy', 13) xiaohong = Person('Xiao Hong', 'girl', 14)
而訪問這些屬性的方式和之前的一樣:
print(xiaohong.name) print(xiaohong.sex) print(xiaohong.age) # 但當訪問不存在的屬性時,依然會報錯 print(xiaohong.birth)
要特別注意的是,初學者定義__init__()方法常常忘記了 self 參數,比如如下的定義:
class Person(object): def __init__(name, sex, age): pass
這種情況下,如果還是如下實例化,將會報錯。
xiaoming = Person('Xiao Ming', 'boy', 13) xiaohong = Person('Xiao Hong', 'girl', 14) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: __init__() takes 3 positional arguments but 4 were given
請定義一個動物類,抽象出名字、年齡兩個屬性,并實例化兩個實例dog
, cat
。
參考答案:
class Animal(object): def __init__(self, name, age): self.name = name self.age = age dog = Animal('wangwang', 1) cat = Animal('mimi', 3) print(dog.name) print(dog.age) print(cat.name) print(cat.age)
請驗證,完成請求
由于請求次數過多,請先驗證,完成再次請求
打開微信掃碼自動綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報