面向物件能做什麼和特性及巢狀
阿新 • • 發佈:2018-11-26
面向物件幫我們解決什麼問題?
面向物件的風封裝的這個特性幫助我們解決了兩個問題 1.歸類: 將方法和靜態變數放置到一個類中 2.打包: 將資料打包到一個物件
面向物件的三大特性
封裝,繼承,多型 1.封裝: 幫我們解決一些方法和屬性進行分類,讓程式碼更加的清晰,提高可讀性提高 2.繼承: 提高程式碼的複用性,將具有相同的屬性和方法提取出來 3,多型: python原生支援多型,崇尚鴨子模型,由於python函式傳參時,無需指定引數型別
對於物件(self)的跟蹤:
self引數是這例項化的過程中幫助我們自動傳遞的.所以在繼承中是,對於結果的輸出時.要看self是誰的物件空間,這會才能確定輸出的結果是誰
在python中支援多繼承,這會對抽象類和介面類的使用會提供很大的幫助
類中的成員
分成三類:
1.變數:
1.例項變數(又可以說是欄位):1),公有例項變數2),私有例項變數
例項一: class Foo: # 類變數(靜態欄位) country = "中國" def __init__(self,name):# 例項變數(欄位) self.name = name def func(self): pass obj1 = Foo('阿童木') obj2= Foo('葫蘆娃') Foo.country
2.類變數: 1),公有類變數2),私有類變數
無法訪問: class Base(object): __secret = "受賄" class Foo(Base): def func(self): print(self.__secret) print(Foo.__secret) obj = Foo() obj.func() 可以訪問: class Base(object): __secret = "受賄" def zt(self): print(Base.__secret) class Foo(Base): def func(self): print(self.__secret) print(Foo.__secret) obj = Foo() obj.zt()
2.方法:
例項方法
class Foo(object): def __init__(self, name): self.name = name # 例項方法 def func(self): print(self.name) obj = Foo('..') obj.func()
靜態方法
class Foo(object): def __init__(self, name): self.name = name # 靜態方法,如果方法無需使用物件中封裝的值,那麼就可以使用靜態方法 @staticmethod def display(a1,a2): return a1 + a2 Foo.display(1,3)
類方法
class Foo(object): # 類方法,cls是類 @classmethod def show(cls,x1,x2): print(cls,x1,x2) # 執行類方法 Foo.show(1,8)
3.屬性(通過方法改造出來):
class Foo(object): def __init__(self): pass @property def start(self): return 1 @property def end(self): return 10 obj = Foo() print(obj.start) print(obj.end)
總結:
1.編寫時:
方法上方寫@property
方法引數:只有一個self
2.呼叫時: 無需加括號 物件.方法
3.應用場景:對於簡單的方法,當無需傳參且有返回值時,可以使用@property
巢狀:
面向物件:
""" 建立三個學校且三個學校的設施內容等都是一致. """ class School(object): def __init__(self, name, address): self.name = name self.address = address def speech(self): print('講課') obj1 = School('老男孩北京校區', '美麗富饒的沙河') obj2 = School('老男孩上海校區', '浦東新區') obj3 = School('老男孩深圳校區', '南山區') class Teacher(object): def __init__(self, name, age, salary): self.name = name self.age = age self.__salary = salary self.school = None t1 = Teacher('李傑', 19, 188888) t2 = Teacher('豔濤', 18, 60) t3 = Teacher('女神',16, 900000) # ############## 老師分配校區 t1.school = obj1 t2.school = obj1 t3.school = obj2 # #################################### # 檢視t1老師,所在的校區名稱/地址 print(t1.school.name) print(t1.school.address) print(t1.name) print(t1.age) t1.school.speech() 準則:欄位和方法的歸類