由面向對象的思想引入面向對象的設計,最後面向對象編程。 類的練習: 類的練習二: 老師http://www.cnblogs.com/linhaifeng/articles/6182264.html ...
由面向對象的思想引入面向對象的設計,最後面向對象編程。
#!/usr/bin/env python # coding:utf-8 def school(name,addr,type): def init(name, addr, type): sch = { 'name': name, 'addr': addr, 'type': type, 'kao_shi': kao_shi, 'zhao_sheng': zhao_sheng, } return sch def kao_shi(school): print('%s 學校正在考試' %school['name']) def zhao_sheng(school): print('%s %s 正在招生' %(school['type'],school['name'])) return init(name,addr,type) print("面向對象的設計") s1=school('oldboy','沙河','私立學校') print(s1) print(s1['name']) s1['zhao_sheng'](s1) s2=school('清華','北京','公立學校') print(s2) print(s2['name'],s2['addr'],s2['type']) s2['zhao_sheng'](s2)
類的練習:
#!/usr/bin/env python # coding:utf-8 ## 類:把一類事物的相同的特征和動作整合到一起就是類,類是一個抽象的概念 ## 對象:就是基於類而創建的一個具體的事物(具體存在的)也是特征和動作整合到一起 # class Chinese: # 經典類 python2中的區分 # '''這是一個中國人的類''' # pass # # print(Chinese) # # # class Chinese(object): # 新式類 python2中的區分 # pass # 實例化到底幹了什麼? # p1 = Chinese() # 實例化 並不像其它語言使用new # print(p1) ## python3中不再區分,都是新式類 class Chinese: '''這裡寫文檔註釋''' # 1 數據屬性 area = "Asia" # 2 函數屬性 def dun(): print("亞洲蹲") def speak(self): print("講漢語 %s" % self) print(dir(Chinese)) print(Chinese.__dict__) # 查看類的屬性字典,字典里存放著類的數據屬性和函數屬性 print(Chinese.area) Chinese.dun() Chinese.__dict__['dun']() Chinese.__dict__['speak']("你好") print(Chinese.__name__) # 類名 print(Chinese.__doc__) # 類的文檔註釋 print(Chinese.__base__) # 基類 <class 'object'> print(Chinese.__bases__) # 基類 (<class 'object'>) print(Chinese.__module__) # 來自模塊
類的練習二:
#!/usr/bin/env python # coding:utf-8 class Chinese: '''這裡寫文檔註釋''' area = "Asia" # def init(name,age,gender): # dic={ # 'name':name, # 'age':age, # 'gender':gender # } # return dic def __init__(self, name, age, gender): print("start...") self.aname = name self.aage = age self.agender = gender print("end...") ## 自動return None 所以,不能加return def dun(self): print("%s 亞洲蹲在 %s " % (self.aname,self.area)) def speak(self,lang): print("%s 講%s " % (self.aname, lang)) p1 = Chinese("Tom",22,"male") # 實例化 print(p1.__dict__) #查看實例的字典 print(p1.aname) print(p1.agender) print(p1.area) p1.dun() p1.speak('本地方言') print(p1.area) # 修改 Chinese.area = '東方大陸' # 修改函數 def xia_dun(self): print("%s 坐在了地上。" % self.aname) Chinese.dun = xia_dun # 修改了類的內部函數 # 增加 Chinese.skin = 'yellow' p2 = Chinese("小明",11,"男") print(p2.area) print(p2.skin) print(p1.skin) # 之前的實例也可以用,因為實例是對類的引用 p2.dun() # 刪除 # del Chinese.area # print(p2.area)
類的數據屬性和函數屬性:(這個說法不同於C# Java PHP)
#!/usr/bin/env python # coding:utf-8 ## 類:把一類事物的相同的特征和動作整合到一起就是類,類是一個抽象的概念 ## 對象:就是基於類而創建的一個具體的事物(具體存在的)也是特征和動作整合到一起 # class Chinese: # 經典類 python2中的區分 # '''這是一個中國人的類''' # pass # # print(Chinese) # # # class Chinese(object): # 新式類 python2中的區分 # pass # 實例化到底幹了什麼? # p1 = Chinese() # 實例化 並不像其它語言使用new # print(p1) ## python3中不再區分,都是新式類 class Chinese: '''這裡寫文檔註釋''' # 1 數據屬性 area = "Asia" # 2 函數屬性 def dun(): print("亞洲蹲") def speak(self): print("講漢語 %s" % self) print(dir(Chinese)) print(Chinese.__dict__) # 查看類的屬性字典,字典里存放著類的數據屬性和函數屬性 print(Chinese.area) Chinese.dun() # 直接執行類中的函數 Chinese.__dict__['dun']() # 通過字典方式調用類中函數 Chinese.__dict__['speak']("你好") print(Chinese.__name__) # 類名 print(Chinese.__doc__) # 類的文檔註釋 print(Chinese.__base__) # 基類 <class 'object'> print(Chinese.__bases__) # 基類 (<class 'object'>) print(Chinese.__module__) # 來自模塊
面向對象應該分清楚實例和類:
#!/usr/bin/env python # coding:utf-8 class Chinese: '''這裡寫文檔註釋''' country = "China" def __init__(self, name): self.aname = name def speak(self,lang): print("%s 講%s " % (self.aname, lang)) p1 = Chinese('alex') print(p1.__dict__) # 查看 print(p1.speak) # 只得到實例中函數的記憶體地址 p1.speak('漢語') # 增加實例中的屬性 p1.age = 18 print(p1.__dict__) print(p1.age) ## 不要修改實例的函數屬性,雖然可以操作。因為不規範 ## 可以通過__dict__的方式更改字典,但是也不建議這麼做,因為不穩定。 # 刪除 del p1.age print(p1.__dict__) ## 分清類和實例 p1.country = "zh" print(Chinese.country) # 這是類的 print(p1.country) # 這是實例的
老師http://www.cnblogs.com/linhaifeng/articles/6182264.html
分清類和實例操作的例子:
#!/usr/bin/env python # coding:utf-8 country = "中國" class Chinese: '''這裡寫文檔註釋''' country = "China" li = ['a','b'] def __init__(self,name): self.name = name print('-----------------',country) # 這裡的country只相當於普通的變數,跟類沒有關係,因為沒有通過點來調用 # self.name = input("請輸入用戶名:") # 不建議在函數中使用輸入輸出。 混亂,可讀性差 def speak(self,lang): print("%s 講%s " % (self.aname, lang)) p1 = Chinese('alex') print("實例內調用", p1.country) # 點的方式調用是從類的內部 print("類調用", Chinese.country) print(p1.li) # p1.li = [1,2,3] # 實例的list被重新賦值 # print(p1.__dict__) # 返回{'name': 'alex', 'li': [1, 2, 3]} # print(Chinese.li) # 返回 ['a', 'b'] p1.li.append('c') # 附加了類中列表的元素 print(p1.__dict__) # 實例的字典中沒有 li 這個列表 print(Chinese.li) # 類的列表被添加內容