類的繼承
什麼是繼承?
繼承是一種新建類的方式,新建的類稱為子類,被繼承的類稱為父類。python中,父類、子類(派生類)只有在繼承的時候才會產生。
繼承的特性:子類會繼承父類所有的屬性。
為什麼要用繼承?
使用繼承可以減少**的冗餘。
物件的繼承
python中支援乙個類同時繼承多個父類(不推薦使用,當繼承多個父類的時候,功能與功能之間會出現混亂。)
使用__bases__方法可以獲取物件繼承的類
class a:
def __init__(self,a):
self.a =a
class b:
def __init__(self,b):
self.b =b
class c(a,b):
pass
print(c.__bases__)
在python3中如果乙個類沒有繼承任何類,則預設繼承object類
在python2中如果乙個類沒有繼承任何類,不會繼承object類
物件查詢屬性的順序
物件本身--->物件的類--->父類--->父類的父類,如果還沒找到就會報錯
class foo:
def f1(self):
print('foo.f1')
def f2(self): # self = b
print('foo.f2')
self.f1() # b.f1()
class bar(foo):
def f1(self): # b.f1()
print('bar.f1')
b = bar()
b.f2() # foo.f2
foo.f2
bar.f1
類的派生
派生:子類中新增新的屬性得過程,這個過程就叫做派生;注意的是,在新增新的屬性同時也會繼承父類所有的東西。
派生方法一
類似於函式呼叫
class animal:
def __init__(self,height,weight):
self.height = height
self.weight = weight
def jiao(self):
print('jiao')
class people(animal):
def __init__(self,height,weight,name,age):
animal.__init__(self,height,weight) #這個其實就是函式呼叫,不要繼承也能實現
self.name = name
self.age = age
def read(self):
print('read')
派生方法二
super().__init__方法
class animal:
def __init__(self,height,weight):
self.height = height
self.weight = weight
def jiao(self):
print('jiao')
class people(animal):
def __init__(self,height,weight,name,age):
super().__init__(self,height,weight) # python3中裡面不需要新增引數,但是python2 中需要新增super(people,self)
self.name = name
self.age = age
def read(self):
print('read')
類的組合
組合是用來解決類與類之間**冗餘的問題
class people:
def __init__(self,name,gender):
self.name = name
self.gender = gender
class students(people):
def __init__(self,name,gender,id):
super().__init__(name,gender)
self.id = id
def choose_course(self,course):
print(f'選擇了')
class teachers(people):
def __init__(self,name,gender,level):
super().__init__(name,gender)
self.level = level
def score(self, student, course, score):
print(f'給學生課程打分')
class course():
def __init__(self,name,price):
self.name =name
self.price = price
class admin(people):
def create_course(self,name,price): # create_course = course
course = course(name,price)
print(f'建立了課程')
return course
# 例項化學生
rayn = students('rayn','male','01')
rose = students('rose','fmale','02')
# 例項化老師
nick = teachers('nick','male',1)
tank = teachers('tank','fmale',2)
#例項化管理員
egon = admin('egon','male')
# 例項化課程
python = egon.create_course('python','20000') #egon.create_course == egon.course
linux = egon.create_course('linux','18000')
# print(python.__dict__)
rayn.choose_course(python)
rose.choose_course(linux)
nick.score(rayn,python,100)
tank.score(rose,linux,1)
菱形繼承問題
類的分類
新式類繼承了object的類以及該類的子類,都是新式類;python3中所有的類都是新式類。
經典類沒有繼承object的類以及該類的子類,都是經典類,只有python2中才有經典類。
菱形繼承問題
如果繼承關係為菱形結構,即子類的父類最後繼承了同乙個類,那麼屬性的查詢方式有兩種:
經典類:深度優先
新式類:廣度優先
我們也可以用print(類名.mro())來檢視類的繼承關係
類的多型與多型性
多型:多型值的是一類事物有多種形態(乙個抽象類有多個子類,因而多型的概念依賴於繼承)
多型性:
多型性是指具有不同功能的函式,可以使用相同的函式名;這樣就可以用乙個函式名呼叫不同內容的函式。
opencv dnn分類網路呼叫 python版
dnn測試使用示例,以分類網路為例實現。def load model onnx model net cv2.dnn.readnetfromonnx onnx model net.setpreferablebackend cv2.dnn.dnn backend cuda net.setpreferab...
CCF 202006 1 線性分類器 python
題目 線性分類器 line 題目描述 考慮乙個簡單的二分類問題 將二維平面上的點分為a和b兩類。訓練資料報含n個點,其中第i個點 1 i n 可以表示為乙個三元組 x,y,type 即該點的橫座標 縱座標和類別。在二維平面上,任意一條直線可以表示為 x y 0的形式,即由 三個引數確定該直線,且滿足...
分類 繼承 封裝 多型
分類 category 作用 在不改變原類的基礎上為類新增一些方法 便於合作開發 注意 1.分類只能增加方法,不能增加成員變數 2.分類方法中可以訪問原類中已宣告的成員變數 3.分類中可以實現原類中的方法,覆蓋原類中的方法,使原類中的方法不能使用,所以一般分類中不實現原類的方法。4.方法呼叫優先順序...