day25--python初識類和對象
一、面向對象的定義
說到面向對象,我們先來看一下面向過程的定義:面向過程的程序設計的核心是過程(流水線式思維),過程即解決問題的步驟,面向過程的設計就好比精心設計好一條流水線,考慮周全什麽時候處理什麽東西。優點:降低了程序的復雜度,使得程序的運行過程變得直觀明了。缺點:一套流水線或者流程就是用來解決一個問題,生產汽水的流水線無法生產汽車,即便是能,也得是大改,改一個組件,牽一發而動全身。
面向對象的定義:面向對象的程序設計的核心是對象,萬物皆對象。優點:解決了程序的擴展性。對某一個對象單獨修改,會立刻反映到整個體系中,如對遊戲中一個人物參數的特征和技能修改都很容易。缺點:可控性差,無法向面向過程的程序設計流水線式的可以很精準的預測問題的處理流程與結果,面向對象的程序一旦開始就由對象之間的交互解決問題,即便是上帝也無法預測最終結果。於是我們經常看到一個遊戲人某一參數的修改極有可能導致陰霸的技能出現,一刀砍死3個人,這個遊戲就失去平衡。
二、類和對象
類是一個抽象的概念,是把一類事物的想的特征和動作整合到一起。對象是基於類而創建出來的一個個具體的‘對象‘,也是特征和動作整合到一塊。必須牢記類是抽象的模板,而實例是根據類創建出來的一個個具體的“對象”,每個對象都擁有相同的方法,但各自的數據可能不同。
三、定義類
在Python中,定義類是通過class
關鍵字:
class Student(object): #類名首字母要大寫,object為繼承對象 pass
>>> bart = Student() #創建創建出Student
的實例
>>> bart
<__main__.Student object at 0x0000000002F12EB8> #變量bart
Student
的實例,後面的0x10a67a590
是實例的內存地址>>> Student
<class ‘__main__.Student‘>
下面來看一個具體的例子:
class Student(object): ability = ‘優秀‘ def __init__(self, name, score): self.name = name self.score = score def ask_questions(self): print(‘{0}正在問數學問題‘.format(self.name)) def examination(self): print(‘{0}考試的成績為{1}‘.format(self.name,self.score)) student1 = Student(‘XiaoMing‘,90,) #類的實例化 print(student1.__dict__) #查看實例屬性 print(Student.__dict__) #查看類屬性 student1.ask_questions() #實例調用類的函數屬性,實例沒有函數屬性,只能調用類的函數屬性 print(student1.ability) #訪問類的數據屬性
1.類的函數屬性中所傳入的self其實就是實例本身(student1)
2.實例調用的是類的函數屬性,實例沒有函數屬性,只能調用類的函數屬性
3.實例在調用數據屬性的時候如果在__init__裏找不到,那麽就會向上一層找,再找不到就不報錯
類屬性的增刪改查
class Student(object): ability = ‘優秀‘ def __init__(self, name, score): self.name = name self.score = score def ask_questions(self): print(‘{0}正在問數學問題‘.format(self.name)) def examination(self): print(‘{0}考試的成績為{1}‘.format(self.name,self.score)) student1 = Student(‘XiaoMing‘,90,) #類實例的實例化 print(Student.ability) #查看 Student.ability = ‘良好‘ #修改 print(Student.ability) Student.sport = ‘basketball‘ #增加 print(Student.sport) print(Student.__dict__) #查看屬性字典中是否增加了sport這一項 del Student.sport #刪除 print(Student.__dict__) #查看屬性字典中是否刪除了sport這一項 print(Student.sport) #AttributeError: type object ‘Student‘ has no attribute ‘sport‘
實例屬性的增刪改查
class Student(object): ability = ‘優秀‘
L = [‘a‘,‘b‘]
def __init__(self, name, score): self.name = name self.score = score def ask_questions(self): print(‘{0}正在問數學問題‘.format(self.name)) def examination(self): print(‘{0}考試的成績為{1}‘.format(self.name,self.score)) student1 = Student(‘XiaoMing‘,90,) #類實例的實例化 print(student1.ability) #查看 student1.name = ‘XiaoHua‘ #修改 print(student1.name) student1.sport = ‘basketball‘ #增加 print(student1.sport) print(student1.__dict__) #查看屬性字典中是否增加了sport這一項 del student1.sport #刪除 print(student1.__dict__) #查看屬性字典中是否刪除了sport這一項 #輸出: 優秀 XiaoHua basketball {‘name‘: ‘XiaoHua‘, ‘score‘: 90, ‘sport‘: ‘basketball‘} {‘name‘: ‘XiaoHua‘, ‘score‘: 90}
補充:
在上面調用student1.L.append(‘c‘),此時改的是類的L,因為實例student1中根本沒有這個屬性。
但是如果是student.L = [‘q‘,‘w‘,‘e‘] 此時相當於新增了一個實例的L屬性列表,對類的數據屬性中的L並不會產生任何影響
註意:新增屬性是通過賦值操作來完成的。
day25--python初識類和對象