在Python中,類經過 class 關鍵字定義。以 Person 爲例,定義一個Person類以下:python
class Person(object):
pass
按照 Python 的編程習慣,類名以大寫字母開頭,緊接着是(object),表示該類是從哪一個類繼承下來的。類的繼承將在後面的章節講解,如今咱們只須要簡單地從object類繼承。編程
有了Person類的定義,就能夠建立出具體的xiaoming、xiaohong等實例。建立實例使用 類名+(),相似函數調用的形式建立:python2.7
xiaoming = Person()
xiaohong = Person()
請建立包含兩個 Person 類的實例的 list,並給兩個實例的 name 賦值,而後按照 name 進行排序。對象
1 #python 2.7 2 class Person(object): 3 pass 4 5 p1 =Person() 6 p1.name ='Bart' 7 p2 =Person() 8 p2.name ='Adam' 9 p3 =Person() 10 p3.name ='Lisa' 11 L1 =[p1, p2, p3] 12 L2 = sorted(L1,key=lambda x: x.name) 13 print L2[0].name 14 print L2[1].name 15 print L2[2].name
輸出blog
Adam
Bart
Lisa排序
請定義Person類的__init__方法,除了接受 name、gender 和 birth 外,還可接受任意關鍵字參數,並把他們都做爲屬性賦值給實例。
1 #python2.7 2 class Person(object): 3 def __init__(self,name,gender,birth,**kw): 4 self.name = name 5 self.gender = gender 6 for k,w in kw.items(): 7 setattr(self,k,w) 8 9 xiaoming =Person('xiao ming','Male','1990-1-1', job='Student') 10 print xiaoming.name 11 print xiaoming.job
輸出
xiao ming
Student
請給Person類的__init__方法中添加name和score參數,並把score綁定到__score屬性上,看看外部是否能訪問到。
1 #python2.7 2 class Person(object): 3 def __init__(self, name, score): 4 self.name = name 5 self.__score = score 6 def __str__(self): 7 return str(self.__score) 8 9 p =Person('Bob',59) 10 print p.name 11 print p 12 print p.__score
輸出
Bob
59
Traceback (most recent call last):
File "test.py", line 12, in <module>
print p.__score
AttributeError: 'Person' object has no attribute '__score'
請給 Person 類添加一個類屬性 count,每建立一個實例,count 屬性就加 1,這樣就能夠統計出一共建立了多少個 Person 的實例。
1 #python 2.7 2 class Person(object): 3 count =0 4 def __init__(self,name): 5 self.name = name 6 7 p1 =Person('Bob') 8 Person.count +=1 9 print Person.count 10 p2 =Person('Alice') 11 Person.count +=1 12 print Person.count 13 p3 =Person('Tim') 14 Person.count +=1 15 print Person.count
輸出
1
2
3
請把上節的 Person 類屬性 count 改成 __count,再試試可否從實例和類訪問該屬性。
1 class Person(object): 2 __count =0 3 def __init__(self, name): 4 Person.__count +=1 5 self.name = name 6 7 p1 =Person('Bob') 8 p2 =Person('Alice') 9 print Person.__count
輸出
Traceback (most recent call last):
File "test.py", line 9, in <module>
print Person.__count
AttributeError: type object 'Person' has no attribute '__count'
請給 Person 類增長一個私有屬性 __score,表示分數,再增長一個實例方法 get_grade(),能根據 __score 的值分別返回 A-優秀, B-及格, C-不及格三檔。
1 #python 2.7 2 class Person(object): 3 def __init__(self, name, score): 4 self.name = name 5 self.__score = score 6 def get_grade(self): 7 if self.__score >=85: 8 return'A' 9 elif self.__score >=60: 10 return'B' 11 else: 12 return'C' 13 14 p1 =Person('Bob',90) 15 p2 =Person('Alice',65) 16 p3 =Person('Tim',48) 17 print p1.get_grade() 18 print p2.get_grade() 19 print p3.get_grade()
輸出
A
B
C
因爲屬性能夠是普通的值對象,如 str,int 等,也能夠是方法,還能夠是函數,你們看看下面代碼的運行結果,請想想 p1.get_grade 爲何是函數而不是方法:
class Person(object): def __init__(self, name, score): self.name = name self.score = score self.get_grade = lambda: 'A' p1 = Person('Bob', 90) print p1.get_grade print p1.get_grade()
結果
<function <lambda> at 0x029F9AF0> A
4.10 python中定義類方法
若是將類屬性 count 改成私有屬性__count,則外部沒法讀取__score,但能夠經過一個類方法獲取,請編寫類方法得到__count值。
1 #python 2.7 2 class Person(object): 3 __count =0 4 @classmethod 5 def how_many(cls): 6 return cls.__count 7 def __init__(self,name): 8 self.name = name 9 Person.__count +=1 10 11 print Person.how_many() 12 p1 =Person('Bob') 13 print Person.how_many()
輸出
01