通過(guò)前面的方式定義一個(gè)實(shí)例的屬性非常方便,但也有一些問(wèn)題。
首先,如果定義屬性的過(guò)程中使用了不同的屬性名字,比如性別,前者使用了sex,后者使用了gender,那對(duì)于一個(gè)類(lèi)的不同實(shí)例,存儲(chǔ)一個(gè)信息就用了兩個(gè)不同的屬性,在后面將會(huì)難以維護(hù)。
其次,名字、性別、年齡等等,都是人的基本信息,在抽象一個(gè)類(lèi)的時(shí)候,理應(yīng)包含這些信息。
在定義 Person 類(lèi)時(shí),可以為Person類(lèi)添加一個(gè)特殊的__init__()方法,當(dāng)創(chuàng)建實(shí)例時(shí),__init__()方法被自動(dòng)調(diào)用,我們就能在此為每個(gè)實(shí)例都統(tǒng)一加上以下屬性:
class Person(object): def __init__(self, name, sex, age): self.name = name self.sex = sex self.age = age
需要注意的是,__init__() 方法的第一個(gè)參數(shù)必須是 self(也可以用別的名字,但建議使用習(xí)慣用法),后續(xù)參數(shù)則可以自由指定,和定義函數(shù)沒(méi)有任何區(qū)別。
定義類(lèi)后,就可以相應(yīng)的實(shí)例化對(duì)象了,需要注意的是,在實(shí)例化的時(shí)候,需要提供除self以外的所有參數(shù)。
xiaoming = Person('Xiao Ming', 'boy', 13) xiaohong = Person('Xiao Hong', 'girl', 14)
而訪(fǎng)問(wèn)這些屬性的方式和之前的一樣:
print(xiaohong.name) print(xiaohong.sex) print(xiaohong.age) # 但當(dāng)訪(fǎng)問(wèn)不存在的屬性時(shí),依然會(huì)報(bào)錯(cuò) print(xiaohong.birth)
要特別注意的是,初學(xué)者定義__init__()方法常常忘記了 self 參數(shù),比如如下的定義:
class Person(object): def __init__(name, sex, age): pass
這種情況下,如果還是如下實(shí)例化,將會(huì)報(bào)錯(cuò)。
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
請(qǐng)定義一個(gè)動(dòng)物類(lèi),抽象出名字、年齡兩個(gè)屬性,并實(shí)例化兩個(gè)實(shí)例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)
請(qǐng)驗(yàn)證,完成請(qǐng)求
由于請(qǐng)求次數(shù)過(guò)多,請(qǐng)先驗(yàn)證,完成再次請(qǐng)求
打開(kāi)微信掃碼自動(dòng)綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書(shū)簽
舉報(bào)