@property、關聯關係、繼承、多繼承
阿新 • • 發佈:2021-07-29
1.@property使用來修飾屬性的,將屬性私有化改為公有化,但是可以設定屬性條件
格式:
class Person: def __init__(self,name,age): self.name = name self.age = age @property def age(self): return self.age @age.setter def age(self,age): if age >0 and age <100: self.age = age else: print('不屬於正常範圍!') def __str__(self): return '{}今年{}歲!'.format(self.name,self.age) p = Person('張三',20)#建立物件 p.age = 25 p.__str__()#結果為張三今年25歲!
2.關聯關係分為兩種:一種是has a關係,另外一種是is a關係
3.has a關係是指一個類包含另外一種類,或者另外幾種類
class Road: def __init__(self,r_name,l): self.r_name = r_name self.l = l class Car:def __init__(self,c_name,speed): self.c_name = c_name self.speed = speed def get_time(self,road):#呼叫Road類的物件,以及方法 t = road.l//self.speed return '{}在{}行駛了{}小時'.format(self.c_name,road.r_name,t) def __str__(self): return '車名:{},時速:{}'.format(self.c_name,self.speed) r = Road('106國道',336) c = Car('奧迪',100) print(c.get_time())#結果為奧迪在106國道上面行駛了3小時 print(c.__str__())#結果為車名:奧迪 時速100
4.is a其實就是繼承的關係,子類繼承父類
格式子類名(父類名):
class Person: def __init__(self,num,name,salary):#初始化方法 self.num = num self.name = name self.salary = salary def get_num(self):#獲取工號方法 return self.num def get_name(self):#獲取年齡方法 return self.name def set_name(self,name):#設定姓名方法 self.name = name def get_salary(self): return self.salary def __str__(self):#檢視員工的所有資訊 return '工號為{}的員工{},薪資為{}'.format(self.num,self.name,self.salary) #定義子類Worker類 class Worker(Person): def __init__(self,hours,h_salary): super().__init__()#呼叫父類的方法,通過super().方法名 self.hours = hours self.h_salary = h_salary def get_salary(self):#重寫父類方法 salary += hours*h_salary return self.salary w = Worker(101,'張三',3000,200,15) print(w.get_salary)#結果為6000#無需重寫父類方法,可以共用 print(w.get_num())#結果,101 w.set_name('張小三')#無需重寫父類方法,可以共用 print(w.__str__())#結果為員工號為101的員工張小三,薪資6000 #直接呼叫父類的__str__()
5.多繼承:就是一個子類可以繼承多個父類
python2使用的是經典類:深度優先
python3使用的是新式類:廣度優先:從左至右,深度優先
#新式類 class P1(object): def foo(self): print('p1----->foo') def bar(self): print('p1----->bar') class P2(object): def foo(self): print('p2----->foo') def bar(self): print('p2----->bar') class C1(P1,P2): pass class C2(P1,P2): def foo(self): print('c2----->bar') class D(C1,C2): pass d = D() d.foo()#結果為p1----->foo d.bar()#c2----->bar '''解析: 1)D類物件繼承C1,C2類,C1,C2類都繼承P1,P2類,P1,P2類都繼承 object類 2)當物件d在呼叫foo方法時,先去自身的類中尋找方法,發現沒有,再去 由左到右的父類C1中去找,發現C1類中也並沒有,就去父類C2中呼叫,發現沒有該方法,就去C2父類P1中尋找發現有foo方法,故列印p1----->foo 3)當物件d在呼叫bar方法時,先去自身的類中尋找方法,發現沒有,再去 由左到右的父類C1中去找,發現C1類中也並沒有,就去父類C2中呼叫,發現有該方法,故列印C2----->bar 4)如果是經典類的話,在P1,P2類中沒有父類object 它的繼承呼叫是D類沒有找C1類,C1類沒有找C1父類P1類 如果在沒有就找C2,P2,符經典類列印結果為p1----->foo,p1----->bar '''