1、概述python
2、建立類和對象編程
面向對象編程是一種編程方式,此編程方式的落地須要使用 「類」 和 「對象」 來實現,因此,面向對象編程其實就是對 「類」 和 「對象」 的使用。模塊化
類就是一個模板,模板裏能夠包含多個函數,函數裏實現一些功能函數
對象則是根據模板建立的實例,經過實例對象能夠執行類中的函數編碼
#建立類 class Foo: #class 關鍵字,表示要建立類,Foo 類名稱 #建立類中的函數 def Bar(self): #self 特殊參數,必填 #do something # 根據類Foo建立對象obj obj = Foo()
#建立類 class Dog(object): def __init__(self,name): #構造函數,構造方法 ==初始化方法 self.NAME = name def sayhi(self): #類的方法 print("hello , I am a dog. my name is", self.NAME ) def eat(self,food): print("%s is eating %s" %(self.NAME,food)) print(Dog) d = Dog("LiChang") # Dog(d,"LiChang") #實例化後產生的對象 叫 實例 , d2 = Dog("Chuang2") #根據Dog 建立對象 d.sayhi() d2.sayhi() d.eat("baozi")
總結:函數式的應用場景 --> 各個函數之間是獨立且無共用的數據spa
面向對象的三大特性是指:封裝、繼承和多態。設計
1、封裝指針
封裝,顧名思義就是將內容封裝到某個地方,之後再去調用被封裝在某處的內容。code
因此,在使用面向對象的封裝特性時,須要:對象
第一步:將內容封裝到某處
#建立類 class Foo: def __init__(self,name,age): #稱爲構造方法,根據類建立對象時自動執行 self.name = name self.age = age #根據類Foo建立對象 #自動執行Foo類的__init__方法 obj1 = Foo("admin",18) #將admin和18分別封裝到obj1 self的name和age屬性中 #根據類Foo建立對象 #自動執行Foo類的__init__方法 obj2 = Foo("zewei",19) #將zewei和19分別封裝到obj2 self的name和age屬性中
self 是一個形式參數,當執行 obj1 = Foo('admin', 18 ) 時,self 等於 obj1
當執行 obj2 = Foo('zewei',19 ) 時,self 等於 obj2
因此,內容其實被封裝到了對象 obj1 和 obj2 中,每一個對象中都有 name 和 age 屬性,在內存裏相似於下圖來保存。
第二步:從某處調用被封裝的內容
調用被封裝的內容時,有兩種狀況:
一、經過對象直接調用被封裝的內容
上圖展現了對象 obj1 和 obj2 在內存中保存的方式,根據保存格式能夠如此調用被封裝的內容:對象.屬性名
class Foo: def __init__(self, name, age): self.name = name self.age = age obj1 = Foo('wupeiqi', 18) print(obj1.name) # 直接調用obj1對象的name屬性 print(obj1.age) # 直接調用obj1對象的age屬性 obj2 = Foo('alex', 73) print(obj2.name) # 直接調用obj2對象的name屬性 print(obj2.age) # 直接調用obj2對象的age屬性
二、經過self間接調用被封裝的內容
執行類中的方法時,須要經過self間接調用被封裝的內容
class Foo: def __init__(self, name, age): self.name = name self.age = age def detail(self): print self.name print self.age obj1 = Foo('wupeiqi', 18) obj1.detail() # Python默認會將obj1傳給self參數,即:obj1.detail(obj1),因此,此時方法內部的 self = obj1,即:self.name 是 wupeiqi ;self.age 是 18 obj2 = Foo('alex', 73) obj2.detail() # Python默認會將obj2傳給self參數,即:obj1.detail(obj2),因此,此時方法內部的 self = obj2,即:self.name 是 alex ; self.age 是 78
類的語法
class Dog(object): def __init__(self,name,dog_type): self.name = name self.type = dog_type def sayhi(self): print("hello,I am a dog, my name is ",self.name) d = Dog('LiChuang',"京巴") d.sayhi()
self,就是實例自己!你實例化時python會自動把這個實例自己經過self參數傳進去。
class Role(object): #定義一個類, class是定義類的語法,Role是類名,(object)是新式類的寫法,必須這樣寫,之後再講爲何 def __init__(self,name,role,weapon,life_value=100,money=15000): #初始化函數,在生成一個角色時要初始化的一些屬性就填寫在這裏 self.name = name #__init__中的第一個參數self,和這裏的self都 是什麼意思? 看下面解釋 self.role = role self.weapon = weapon self.life_value = life_value self.money = money
面向對象編程 (OOP) 語言的一個主要功能就是「繼承」。繼承是指這樣一種能力:它可使用現有類的全部功能,並在無需從新編寫原來的類的狀況下對這些功能進行擴展。
經過繼承建立的新類稱爲「子類」或「派生類」。
被繼承的類稱爲「基類」、「父類」或「超類」。
繼承的過程,就是從通常到特殊的過程。
要實現繼承,能夠經過「繼承」(Inheritance)和「組合」(Composition)來實現。
在某些 OOP 語言中,一個子類能夠繼承多個基類。可是通常狀況下,一個子類只能有一個基類,要實現多重繼承,能夠經過多級繼承來實現。
繼承概念的實現方式主要有2類:實現繼承、接口繼承。
OO開發範式大體爲:劃分對象→抽象類→將類組織成爲層次化結構(繼承和合成) →用類與實例進行設計和實現幾個階段。
class SchoolMember(object): members = 0 #初始學校人數爲0 def __init__(self,name,age): self.name = name self.age = age def tell(self): pass def enroll(self): '''註冊''' SchoolMember.members +=1 print("\033[32;1mnew member [%s] is enrolled,now there are [%s] members.\033[0m " %(self.name,SchoolMember.members)) def __del__(self): '''析構方法''' print("\033[31;1mmember [%s] is dead!\033[0m" %self.name) class Teacher(SchoolMember): def __init__(self,name,age,course,salary): super(Teacher,self).__init__(name,age) self.course = course self.salary = salary self.enroll() def teaching(self): '''講課方法''' print("Teacher [%s] is teaching [%s] for class [%s]" %(self.name,self.course,'s12')) def tell(self): '''自我介紹方法''' msg = '''Hi, my name is [%s], works for [%s] as a [%s] teacher !''' %(self.name,'Oldboy', self.course) print(msg) class Student(SchoolMember): def __init__(self, name,age,grade,sid): super(Student,self).__init__(name,age) self.grade = grade self.sid = sid self.enroll() def tell(self): '''自我介紹方法''' msg = '''Hi, my name is [%s], I'm studying [%s] in [%s]!''' %(self.name, self.grade,'Oldboy') print(msg) if __name__ == '__main__': t1 = Teacher("Alex",22,'Python',20000) t2 = Teacher("TengLan",29,'Linux',3000) s1 = Student("Qinghua", 24,"Python S12",1483) s2 = Student("SanJiang", 26,"Python S12",1484) t1.teaching() t2.teaching() t1.tell()
class Animal: def __init__(self, name): # Constructor of the class self.name = name def talk(self): # Abstract method, defined by convention only raise NotImplementedError("Subclass must implement abstract method") class Cat(Animal): def talk(self): return 'Meow!' class Dog(Animal): def talk(self): return 'Woof! Woof!' animals = [Cat('Missy'), Dog('Lassie')] for animal in animals: print animal.name + ': ' + animal.talk()