16 靜態 組合 繼承
阿新 • • 發佈:2019-02-27
menu 感受 方案 cls style append 數據屬性 urn 深度
# 既可以訪問實例屬性 也可以訪問雷屬性
# 類方法:可以訪問數據屬性 也可以訪問函數屬性
# 但是不可以訪問實例屬性
# 靜態方法:不能訪問類屬性 也不能訪問實例屬性
class Room: tag = 12 def __init__(self,name,owner,width,length,heigh): self.name = name self.owner = owner self.width = width self.length = length self.heigh = heigh @property def cal_area(self): print(‘%s住的%s總面積是%s‘% (self.owner,self.name,self.width * self.length))return self.width * self.length @classmethod def tell_info(cls,x): print(cls) print(‘------->‘,cls.tag) print(x) @staticmethod def wash_body(a,b,c): print(‘%s正在洗澡‘%a) #靜態方法: # r1 = Room(‘廁所‘,‘alex‘,100,100,100000) # r2 = Room(‘公共廁所‘,‘AA‘,1,1,1) #print(r1.cal_area) #加 property之後可執行函數 靜態屬性 # print(r2.cal_area) # r1.cal_area() #類方法 # Room.tell_info(10) #實例也可以用 #靜態方法 名義上屬於類管理 實際上不可調用類屬性和實例屬性 Room.wash_body(‘AA‘,‘BB‘,‘CC‘) r2 = Room(‘公共廁所‘,‘AA‘,1,1,1) r2.wash_body(‘a‘,‘BBB‘,‘CCC‘) # print(Room.__dict__)
#總結
# 靜態屬性:函數作為數據屬性形式 調用時感受不到內在邏輯
# 類方法:可以訪問數據屬性 也可以訪問函數屬性
# 但是不可以訪問實例屬性
# 靜態方法:不能訪問類屬性 也不能訪問實例屬性
子類:
class School: def __init__(self,name,addr): class Course: def __init__(self,name,price,period,school): c1 = Course(‘linux‘,‘10dollor‘,‘1 h‘,s1) print(c1.__dict__) print(c1.school) #打印內存地址 while True: menu ={ ‘1‘:s1, ‘2‘:s2, ‘3‘:s3 } choice = input(‘>>: ‘) school_obj = menu[choice] name = input(‘namae:‘) price = input(‘‘) new_course = input() print(‘課程[%s]屬於[%s]學校‘%(Course,School)) #low 比解決方案 class Course: def __init__(self,name,price,period,school): class School: def __init__(self, name, addr): #... self.name = name self.Course_list = [] s1.Course_list.append(c1) s1.Course_list.append(c2) for Course_obj in s1.Course_list: print(Course_obj.name)
面向對象的三大特征:繼承 多態 封裝
類的繼承:
class Pclass1:
class Pclass2:
class SubClass(Pclass1):
子類繼承父類所有屬性 但若重名 並不改變父類屬性
當類顯著不同 且較小類是較大類所需組件 用組合比較好
當有很多相同特征 提取相同功能做基類 用繼承
含義2 某子類兼容於某基類 定義一個接口類 子類繼承接口類
並且繼承接口中定義的方法
MRO列表的構造遵循三條準則:
1 子類會優先於父類被檢查
2 多個父類會根據他們在列表總的順序被檢查
3 如果對下一個類存在兩個合法的選擇 選擇第一個父類
新式類:廣度優先 python3
經典類:深度優先 python2
16 靜態 組合 繼承