類的繼承和property
阿新 • • 發佈:2021-01-11
類的繼承
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()