編程範式即編程的方法論,標識一種編程風格:java
你們學習了基本的python語法後,你們能夠寫python代碼了,而後每一個人寫代碼的風格不一樣,這些不一樣的風格就表明了不一樣的流派;python
若是把python的基本語法比做武術的基本功,那麼不一樣的編程風格就比如不一樣的武林門派。編程
雖然你們風格不一樣,可是均可以完成你的編程需求,python是一門面向對象編程語言,可是目前爲止,你從未接觸面向對象編程,然而你已經能夠解決不少問題了,在python中並無人強制你使用哪種固定的風格。數據結構
三大編程範式:編程語言
一、面向過程編程:函數式編程
二、函數式編程:函數
三、面向對象編程:學習
一、編程最開始就是無組織無結構,從簡單控制流中按步寫指令ui
二、從上述的指令中提取重複的代碼塊或邏輯,組織到一塊兒(好比說,你定義一個函數),便實現了代碼重用,且代碼由無結構走向結構化,建立程序的過程變得更具邏輯性spa
三、咱們定義函數都是獨立於函數外定義變量,而後做爲參數傳遞給函數,這意味着:數據與動做是分離的
四、若是咱們把數據和動做內嵌到一個結構(函數或類)裏面,那麼咱們就有了一個‘對象系統’(對象就是數據與函數整合到一塊兒的產物)。
#狗的特徵
dog1={
'name':'朱銳', 'gender':'公', 'type':'藏獒' } dog2={ 'name':'simon', 'gender':'母', 'type':'吉娃娃' } person1={ 'name':'william', 'gender':'母', 'type':'人' } def dog(name,gender,type): # 狗的動做 def jiao(dog): print('一條狗[%s], 汪汪汪' %dog['name']) def chi_shi(dog): print('一條狗[%s] 正在拉屎' %dog['type']) def init(name,gender,type): dog1 = { 'name':name, 'gender':gender, 'type':type, 'jiao':jiao, 'chi_shi':chi_shi, } return dog1 return init(name,gender,type) d1=dog('simon','母','吉娃娃') d2=dog('william','母','藏獒') print(d1) print(d2) d1['jiao'](d1) d2['chi_shi'](d2)
輸出結果:
C:\Python35\python3.exe G:/python_s3/chapter24-面向對象/面向對象.py
{'jiao': <function dog.<locals>.jiao at 0x0000000000B3E0D0>, 'gender': '母', 'chi_shi': <function dog.<locals>.chi_shi at 0x0000000000B3E1E0>, 'type': '吉娃娃', 'name': 'simon'} {'jiao': <function dog.<locals>.jiao at 0x0000000000B3E2F0>, 'gender': '母', 'chi_shi': <function dog.<locals>.chi_shi at 0x0000000000B3E378>, 'type': '藏獒', 'name': 'william'} 一條狗[simon], 汪汪汪 一條狗[藏獒] 正在拉屎
類:把一類事物的相同的特徵和動做整合到一塊兒就是類,類是一個抽象的概念;
對象:就是基於類而建立的一個具體的事物 (具體存在的),也是特徵和動做整合到一塊兒;
面向對象設計(OOD)不會特別要求面向對象編程語言。事實上,OOD能夠由純結構化語言來實現(好比C)。但若是想要構造具有對象性質和特色的數據類型,就須要在程序上作更多的努力。
咱們如今想用程序表述一臺提款機,能夠用面向過程,和麪向對象兩種方式設計。
#用面向對象編程獨有的語法class去實現面向對象設計
class Dog:
def __init__(self,name,gender,type): self.name=name self.gender=gender self.type=type def bark(self): print('一條名字爲[%s]的[%s],狂吠不止' %(self.name,self.type)) def yao_ren(self): print('[%s]正在咬人' %(self.name)) def chi_shi(self): print('[%s]正在吃屎' %(self.type)) dog1=Dog('alex','female','京巴') print(dog1.__dict__) # dog2=Dog('wupeiqi','female','臘腸') # dog3=Dog('yuanhao','female','藏獒') # # dog1.bark() # dog2.yao_ren() # dog3.chi_shi()
一門面向對象的語言不必定會強制你寫OO方面的程序。例如C++能夠被認爲"更好"的「C」;而JAVA,則是萬物皆類,此外還規定,一個源文件對應一個類定義。
然而,在python中,類和OOP都不是平常編程所必需的。儘管它從一開始設計就是面向對象的,而且結構上支持OOP,但Python沒有限定或要求你在你的應用中寫OO的代碼
用面嚮對象語言寫程序,和一個程序的設計是面向對象的,二者是八竿子打不着的兩碼事。
純C寫的Linux Kernel事實上比C++/java 之類語言搞出來的大多數項目更加面向對象-----只是絕大部分人都自覺得本身處處瞎寫的class的苗條代碼纔是面向對象的正統、而死腦筋linus搞得泛文件抽象不過是過程是思惟搞出來的老古董。
一、什麼叫類:類是一種數據結構,就比如一個模型,該模型用來表述一類事物(事物即數據和動做的結合體),用它來生產真實的物體(實例)。
二、什麼叫對象:睜開眼,你看到的一切的事物都是一個個的對象,你能夠把對象理解爲一個具體的事物(事物即數據和動做的結合體)
(例如:鉛筆是對象,人是對象,房子是對象,狗是對象)
三、類與對象的關係:對象都是由類產生的,上帝造人,上帝首先有一個造人的模板,這個模板即人的類,而後上帝根據類的定義來生產一個個的人。
四、什麼叫實例化:由類生產對象的過程叫實例化,類實例化的結果就是一個對象,或者叫作一個實例(實例=對象)
在python中聲明函數與聲明類類似
聲明函數:
1 def functionName(args):
2 '函數文檔字符串'
3 函數體
聲明類:
'''
class 類名:
'類的文檔字符串'
類體
'''
#咱們建立一個類
class Data:
pass
#用類Data實例化出一個對象d1
d1=Data()
類是用來描述一類事物,類的對象指的是這一類事物中的一個個體
是事物就要有屬性,屬性分爲:
一、數據屬性:就是變量
二、函數屬性:就是函數,在面向對象裏一般稱爲方法
注意:類和對象均用點來訪問本身的屬性
理論:數據屬性即變量,類的定義與函數又極其相似,其實能夠用函數的做用域來理解類的屬性調用
查看類的屬性:
咱們定義的類的屬性到此存到哪裏了?有兩種方式查看
dir(類名):查出的是一個名字列表
類名.__dict__:查出的是一個字典,key爲屬性名,value爲屬性值
'''
一、數據屬性
二、函數屬性
'''
class Chinese: ##類名首字母大寫
'這是一箇中國人的類'
dang='民政黨'
def sui_di_tu_tan(): print('朝着牆上就是一口痰') def cha_dui(self): print('插到了前面') print(Chinese.dang) Chinese.sui_di_tu_tan() Chinese.cha_dui('zhurui') # print(dir(Chinese)) # print(Chinese.__dict__) ##查看類的屬性字典 print(Chinese.__dict__['dang']) Chinese.__dict__['sui_di_tu_tan']() Chinese.__dict__['cha_dui'](1)
對象是由類實例化而來,類實例化的結果稱爲一個實例或者稱做一個對象
一樣是dir和內置__dict__兩種方式
__class__
__dict__
'''
1.數據屬性
2.函數屬性
'''
class Chinese:
'這是一箇中國人的類' dang='民政黨' # def __init__(name,age,gender): # dic={ # 'name':name, # 'age':age, # 'gender':gender # } # return dic def __init__(self,name,age,gender): # print('我是初始化函數,我開始運行了') self.mingzi=name #p1.mingzi=name self.nianji=age #p1.nianji=age self.xingbie=gender # print('我結束啦') def sui_di_tu_tan(self): print('%s 朝着牆上就是一口痰' %self.mingzi) def cha_dui(self): print(self) print('%s 插到了前面' %self.mingzi) def eat_food(self,food): print('%s 正在吃%s' %(self.mingzi,food)) p1=Chinese('元昊',18,'female') #--->__init__(self,name,age,gender) p1.sui_di_tu_tan() p1.eat_food('屎') p2=Chinese('武sir',10000,'姑娘') p2.eat_food('韭菜餡餅') print(dir(p2)) # # # p1=Chinese.__init__(p1,name,age,gender) # # print(p1.__dict__) # # print(p1.__dict__['xingbie']) # print(p1.mingzi) # # print(p1.mingzi111111111111111) # # print(p1.dang) # # # print(Chinese.__dict__) # Chinese.sui_di_tu_tan() # Chinese.cha_dui(p1) # # # p1.sui_di_tu_tan() # # print('[------------------->') # p1.cha_dui()
警告:類和對象雖然調用__dict__返回的是一個字典結構,可是千萬不要直接修改該字典,會致使你的opp不穩定
類屬性(增刪改查):
#類的屬性
'''class ChinesePeople:
country='China'
def __init__(self,name):
self.name=name
def play_ball(self,ball):
print('%s 正在打 %s' %(self.name))
def say_word(self,word):
print('%s 說 %s' %(self.name,word))
#查看類屬性
print(ChinesePeople.country)
#修改類屬性
ChinesePeople.country='CHINA'
print(ChinesePeople.country)
#刪除類屬性
del ChinesePeople.country
#增長類屬性
ChinesePeople.country='China'
ChinesePeople.location='Asia'
print(ChinesePeople.__dict__)
#類的數據屬性增刪改查與函數屬性是同樣的
ChinesePeople.say_word=say_word
print(ChinesePeople.__dict__)
'''
class Chinese:
country='China'
def __init__(self,name): self.name=name def play_ball(self,ball): print('%s 正在打 %s' %(self.name)) #查看 print(Chinese.country) #修改 Chinese.country='Japan' print(Chinese.country) p1=Chinese('simon') print(p1.__dict__) print(p1.country) #增長 Chinese.dang='民政黨' # print(Chinese.dang) # print(p1.dang) #刪除 del Chinese.dang del Chinese.country print(Chinese.__dict__) # print(Chinese.country) def eat_food(self,food): print('%s 正在吃%s' %(self.name,food)) Chinese.eat=eat_food print(Chinese.__dict__) p1.eat('飯') def test(self): print('test') Chinese.play_ball=test p1.play_ball()# Chinese.play_ball(p1)
實例屬性(增刪改查):
class Chinese:
country='China'
def __init__(self,name): self.name=name def play_ball(self,ball): print('%s 正在打 %s' %(self.name,ball)) p1=Chinese('simon') print(p1.__dict__) #查看 # print(p1.name) # print(p1.play_ball) #增長 p1.age=18 print(p1.__dict__) print(p1.age) #不要修改底層的屬性字典 # p1.__dict__['sex']='male' # print(p1.__dict__) # print(p1.sex) #修改 p1.age=19 print(p1.__dict__) print(p1.age) #刪除 del p1.age print(p1.__dict__)