1. 程式人生 > 實用技巧 >類的繼承和property

類的繼承和property

類的繼承

property裝飾器

property 定義函式內容 用來繫結給物件的方法,偽裝成資料屬性

案例一、

  成人的BMI數值:
  過輕:低於18.5
  正常:18.5-23.9
  過重:24-27
  肥胖:28-32
  非常肥胖, 高於32
  體6質指數(BMI)=體重(kg)÷身高^2(m)
  EX:70kg÷(1.75×1.75)=22.86
  class People:
        def __init__(self,name,weight,height):
              self.name = name
              self.weight = weight
              self.height = height
  # 定義函式的原因:
        1、從bmi的公式上看,bim應該是觸發動態功能計算得到的
        2、bmi是隨著身高,體重變化而動態變化的,不是一個固定的值
        但是bmi聽起來更像是一個數據屬性,而非功能,所以新增@property
        @property
        def bmi(self):
              my = (self.hegight**2)
              return my
  obj1 = People('liu',70,1.82)
  print(obj1.bmi())   # 不加@property
  print(obj1.bmi)      #加@property

案例二、

  # 查 改 刪
  class People:   #父類
        def __init__(self,name):
              self.__name = name
        def get_name(self):
              return self.__name  # 直接返回查的結果
        
        def set_name(self,val):
              if type(val) is not str:
                    print('str型別')
                    return  # 返回結果
              self.__name = val  # 賦值更改結果
        def del_name(self):
              print('不準刪')
        name = property(get_name,set_name,del_name)
 # 呼叫
  obj1 = People('liu')
  obj1.name = 'LIU'   # 讓更改看起來可像全域性一樣 直接賦予                                    

案例四、最新的裝飾的方法

  class People:
        def __init__(self,name)
              self.__name = name
        @property
        def name(self):
              return self.__name
        @name.setter
        def name(self,val):
              if type(val) is not str:
                    print('必須為字串型別')
                    return
              self.__name = val
        @name.deleter
        def name(self):
        print('不準刪')
  obj = People('liu')
  print(obj.name)               #liu
  obj.name = 'LIU'
  print(obj.name)         #LIU

繼承----->解決類之間的冗餘問題

  1、繼承是一種建立新類的方式,新建的類可稱為子類或者派生類,父類又可稱為基類或者超類
  python支援多繼承,新建的類可以繼承一個或多個父類

多繼承的優缺點

  優點:可以遺傳多個父類的屬性,最大限度的重用程式碼
  缺點:違背了人的思維習慣
  程式碼的可讀性變差(分支較多)
  不建議使用多繼承,可能會引發可惡的菱形問題 擴充套件性變差
  真的涉及到了不可避免的多繼承,應該使用mixins機制

繼承案例一、

  class Student:
        school = '北大'
        def __init__(self,name,age,sex):
              self.name = name
              self.age = age
              self.sex = sex
        def choice_course(self):
              print('%s 選課中' %self.name)
  class Teacher:
        school = '北大'
        def __init__(self,name,age,sex,level,salary)
              self.name = name
              self.age = age
              self.sex = sex  
              self.level = level
              self.salary = salary
        def score(self):
              print('%s 正在打分' %self.name)
        # Student和Teacher之間 name,age,sex 函式產生了冗餘的問題

案例二:基於繼承解決類和類之間的冗餘問題

  class People:
        school = '北大'
        def __init__(self,name,age,sex): 共有的屬性在父類裡面定義
              self.name = name
              self.age = age
              self.sex = sex  
  class Student(People):
        def choose_course(self):
              print('%s 正在選課' %self.name)
  class Teacher(People):
        def __init__(self,name,age,sex,level,salary) # Teacher 需要的屬性
        # 和父類要__init__
              People.__init(self,name,age,sex)
              self.level = level
              self.salary = salary
        def score(self):
              print('%s 正在打分' %self.name)
  tea_obj = Teacher('xxx',18,'xx',12000,10)
  tea_obj.score()
  print(tea_obj.name)    xxx

屬性查詢

  class Foo:
        def f1(self):
              print('Foo.f1)
        def f2(self)
              print('Foo.f2')
              self.f1()  --> # Bar.f1 
  class Bar(Foo):
        def f1(self):
              print('Bar.f1')
  obj = Bar()
  obj.f2()       --> Foo.f2

如果想呼叫自己的f1

  class Foo:
        def __f1(self):
              print('Foo.f1)

        def __f2(self):
              print('Foo.f2)
              self.__f1()

  class Bar(Foo):
        def f1(self):
              print('Bar.f1')

  obj = Bar()
  obj.f2()