1. 程式人生 > 其它 >@property、關聯關係、繼承、多繼承

@property、關聯關係、繼承、多繼承

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
'''