python基礎-面向物件(一)概念的引入
阿新 • • 發佈:2020-12-07
先看需求:如何描述一條狗?一種是這條狗的獨有特徵(如名字,性別,類別),還有所有狗都有的行為(吃喝拉撒睡),如何實現呢,獨有特徵肯定用dict,行為當然是用函式來完成。
dog1={ 'name':'旺財', 'gender':'母', 'type':'藏獒' } person1={ 'name':'alex', 'gender':'母', 'type':'人' } def eat(dog): print('%s在吃屎'%dog['name']) def jiao(dog): print('%s 在叫'%dog['name']) jiao(dog1)
但是會有一個問題,人person1,他也可以呼叫狗的def eat(),def jiao()。如何避免這個問題呢?難道每次呼叫函式都用 if 判斷?
其實根據函式的作用域,可以把函式放到一個大的函式裡邊,做成子函式,那麼外部的人就呼叫不到了
person1 = { 'name': 'alex', 'gender': '母', 'type': '人' } def dog(): def eat(dog): print('%s在吃屎' % dog['name']) def jiao(dog): print('%s 在叫' % dog['name']) dog1 = { 'name': '旺財', 'gender': '母', 'type': '藏獒', 'eat': eat, 'jiao': jiao } return dog1 dog()['jiao'](dog()) dog()['eat'](dog())
現在還有個問題,就是狗被寫死了,名字,性別,類別等都被寫死了!如何不寫死,當然是根據使用者的引數傳入來寫。
person1 = { 'name': 'alex', 'gender': '母', 'type': '人' } def dog(name, gender, type): def eat(dog): # 需要字典dog print('%s在吃屎' % dog['name']) def jiao(dog): # 需要字典dog print('%s 在叫' % dog['name']) dog1 = { 'name': name, 'gender': gender, 'type': type, 'eat': eat, 'jiao': jiao } return dog1 d1 = dog('旺財', '母', '藏獒') d1['eat'](d1) # 注意,需要的引數是dict,傳的引數是自己,返回的就是dog1的dict。
一般獨有的特徵會放到一個init初始化函式裡面
程式碼就被優化成這樣
person1 = { 'name': 'alex', 'gender': '母', 'type': '人' } def dog(name, gender, type): def eat(dog): # 需要字典dog print('%s在吃屎' % dog['name']) def jiao(dog): # 需要字典dog print('%s 在叫' % dog['name']) def init(name,gender,type): dog1 = { 'name': name, 'gender': gender, 'type': type, 'eat': eat, 'jiao': jiao } return dog1 return init(name,gender,type) d1 = dog('旺財', '母', '藏獒') d1['eat'](d1) # 注意,需要的引數是dict,傳的引數是自己,返回的就是dog1的dict。
從上面可以看出來:
1.類:是具有相同屬性的一類實物的集合。
2.物件:物件是類當中具體的某個物體。
再來一個需求:如何描述一個學校?特徵(名字,地址,私立還是公立),動作(招生,考試),根據上面的例子程式碼應該可以一步到位了。
def school(name,addrs,type): def init(name,addrs,type): school1={ 'name':name, 'addrs':addrs, 'type':type, 'zhaosheng':zhaosheng, 'kaoshi':kaoshi } return school1 def zhaosheng(school): print('%s學校正在招生'%school['name']) def kaoshi(school): print('%s學校正在考試'%school['name']) return init(name,addrs,type) school1=school('北大','北京','私立')['kaoshi'](school('北大','北京','私立')) #傳的是自己self
上面用函式def完成了一個類,說明
面向物件設計:是將一類具體實物的資料和動作整合到一起。不一定非得用Class,用函式def也可以實現
面向物件程式設計:用Class+例項/物件的方法去實現面向物件設計。如C++有很多class