python繼承分類 python 類與繼承

2021-10-21 07:20:04 字數 3648 閱讀 8557

類的繼承

什麼是繼承?

繼承是一種新建類的方式,新建的類稱為子類,被繼承的類稱為父類。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.方法呼叫優先順序...