python面向對象之靜態屬性/靜態方法/類方法/組合
阿新 • • 發佈:2018-12-25
int html pan 定義 都是 itl 接口繼承 操作 icm
#!/usr/bin/env python # coding:utf-8 class Campus: def __init__(self,name,addr,type): self.Name = name self.Addr = addr self.Type = type def details(self): print("學樣的詳細信息, 名稱:%s 地址:%s 類型:%s" %(self.Name,self.Addr,self.Type) ) c1 = Campus("南京大學","江蘇南京","985") print(c1.__dict__) print(Campus.__dict__) # 註意實例字典與類的字典的區別 c1.details() Campus.details(c1) # 使用類去調用方法時,需要傳入具體的實例參數 #### 也推薦看看廖雪峰的教程: https://www.bilibili.com/video/av3803706?from=search&seid=6691387782253130457 ##### class Room: clr = ‘可選的,默認白色‘ def __init__(self,name,owner,width,length,height): self.name = name self.owner = owner self.width = width self.length = length self.height = height def area(self): return self.width * self.length @property # 此裝飾器就是負責把一個方法變成靜態屬性調用 def space(self): return self.width * self.length * self.height @classmethod # 供類使用的方法,雖然實例也可以調用 def colour(cls): # 此 cls 表示自動傳遞類名作為參數 print("房間的色彩是",cls.clr) @staticmethod # 比喻為類的工具包. 只是名義上的歸屬類管理,不能使用類變量和實例變量 def round(a,b): print("地板使用%s或%s"%(a,b)) ## 靜態屬性既可以訪問實例屬性,又可以訪問類的屬性 ## 類方法 不能訪問到實例的屬性 ## 靜態方法 不能訪問類的屬性,也不能訪問實例的屬性 # self跟實例綁定, cls跟類綁定, @staticmethod 跟誰都不綁定 r1 = Room(‘公寓‘,‘alex‘,9,9,2) r2 = Room(‘house‘,‘jerry‘,12,13,5) print(r1.area()) print(r2.area()) print("空間:",r1.space) # 調用方法不一樣了,省掉括號 print("空間:",r2.space) # @property的好處是封裝一個屬性, 使用時完全感知不到背後的邏輯 Room.colour() # 跟實例沒有關系,只是類調用自己的函數. 類級別的操作. Room.round(‘木板‘,‘瓷磚‘) r1.round("牛皮","水泥") # 類或實例都可以調用 ## 學著學著感覺到累了, 就去B站找了下以前喜歡的視頻: ## 磚家 "你不知道的西遊記" https://www.bilibili.com/video/av3803706?from=search&seid=6691387782253130457 ## 這個系列的解說真是精彩, 以前在UKu上看過, 強力推薦給剛入社會的年輕人們看看.
組合:
#!/usr/bin/env python # coding:utf-8 # class Hand: # pass # # # class Foot: # pass # # # # class Trunk: # pass # # # class Head: # pass # # # class Person: # def __init__(self, id_num, name): # self.id_num = id_num # self.name = name # self.hand = Hand() # 使用小類的實例化 # self.foot = Foot() # self.trunk = Trunk() # self.head = Head() # # # p1 = Person(‘111111‘, ‘alex‘) # print(p1.__dict__) # ## 類的組合:組合指的是,在一個類中以另外一個類的對象作為數據屬性,稱為類的組合 # ## 參考: http://www.cnblogs.com/linhaifeng/articles/7340153.html class School: def __init__(self,name,addr): self.name = name self.addr = addr class Course: def __init__(self,name,price,period,school): self.name = name self.price = price self.period = period self.school = school class Teacher: def __init__(self,name,age,gender,): self.name = name self.age = age self.gender = gender s1 = School("Mooc",‘北京‘) s2 = School("Mooc",‘上海‘) s3 = School("Mooc",‘線上‘) msg = ‘‘‘ 1 xx學院 新校區 2 xx學院 老校區 3 xx學院 網絡校區 ‘‘‘ while True: print(msg) menu={ ‘1‘:s1, ‘2‘:s2, ‘3‘:s3 } choice = input("選擇學校:") school_obj = menu[choice] n_name = input("課程名:") n_price = input("課程價格:") n_period = input("課程周期:") new_course= Course(n_name,n_price,n_period,school_obj) print("課程[%s]屬於[%s]學校,費用[%s]" %(new_course.name,new_course.school.name,new_course.price))
雖然這些都是小練習,與實際生產還有很大差距,但是沒有這些練習的熟練掌握,怎麽能玩轉實際生產呢?
繼續!
抽象類與接口練習:
#!/usr/bin/env python # coding:utf-8 import abc #利用abc模塊實現抽象類(沒錯,就叫abc) class All_file(metaclass=abc.ABCMeta): # 定義成基類 @abc.abstractmethod # 用裝飾器的方式定義抽象方法,無需實現功能 def read(self): pass # 基類方法不用實現 子類必須定義功能 @abc.abstractmethod def write(self): pass ## 接口繼承:就是定義了一個父類,規定了所有的子類必須實現父類的方法,但是父類不實現。並不是為了節省代碼 ## 子類繼承時必須實現具體地實現基類規定的方法,不實現就辦法實例化 class Disk(All_file): def read(self): print("disk read") def write(self): print("disk write") class Mem(All_file): def read(self): print("mem read") def write(self): print("mem write") class cdrom(All_file): def read(self): print("cd read") def write(self): print("burn cd") cd1 = cdrom() # 如果 cdrom沒有去實現write方法,實例化時就會報錯 ‘‘‘ 參考: http://www.cnblogs.com/linhaifeng/articles/7340153.html 抽象類與接口 抽象類的本質還是類,指的是一組類的相似性,包括數據屬性(如all_type)和函數屬性(如read、write),而接口只強調函數屬性的相似性。 抽象類是一個介於類和接口直接的一個概念,同時具備類和接口的部分特性,可以用來實現歸一化設計 ‘‘‘
python面向對象之靜態屬性/靜態方法/類方法/組合