繼承 新式類 經典類

2022-09-16 16:45:21 字數 4144 閱讀 5528

目錄

二、利用繼承減少**冗餘

三、繼承的菱形問題

四、如何重用父親的屬性和方法

經典類:python2中有繼承類

新式類:python3中都是新式類

是一種新建類方式,繼承了乙個類,類中的屬性和方法就在子類中

父類/基類

子類/派生類

新式類:只要繼承了object類,在python3中,預設繼承object類。

經典類:沒有繼承object的類,就是經典類

在python3中都是新式類

class a:  # 新式類:預設繼承object,相當於:class a(object)

pass

在python2中

class a:  #經典類,沒有繼承

pass

class a(object): # 相當於python3中的新式類

pass

class a:

pass

class c(a): # c繼承了a這個類

pass

class a:

pass

class b:

pass

class c(a,b): # c繼承了a,b這倆個類

pass

class a:

pass

class b:

pass

class c(a,b): # c繼承了a,b這倆個類

pass

print(c.__bases__)#c的父類

print(c.__dict__)#c中的方法

print(c.__name__)#c的名字

#輸出:

(, )

c

類例項化會自動調節__init__如果類中沒有,就會去父類找

class person(object):

school = 'oldboy'

def __init__(self,name,age):

self.name = name

self.age = age

class teacher(person):

pass

class student(person):

pass

stu = student('crean',18)

print(stu.name)

class a:

h = "aaa"

class b(a):

h = "bbb"

class c(b):

h = "ccc"

class d(c):

# h = "ddd"

pass

d = d()

print(d.h)

#ccc

class a:

h = "aaa"

class b:

h = "bbb"

class c:

h = "ccc"

class d(a,b,c):

# h = "ddd"

pass

d = d()

print(d.h)

#aaa

class g(object):

a = "ggg"

pass

class f(g):

# a = "fff"

pass

class e(g):

# a = "eee"

pass

class d(g):

# a = "ddd"

pass

class c(f):

# a="ccc"

pass

class b(e):

# a="bbb"

pass

class a(b,c,d):

# a="aaaa"

pass

a = a()

print(a.a)

print(a.mro())

print(a.__mro__)

#ggg

[, , , , , , , ]

(, , , , , , , )

mro()列表,繼承順序查詢列表(只在新式類中有)1

mro()和、__mro__是相等的

print(a.mro())

print(a.__mro__)

#[, , , , , , , ]

(, , , , , , , )

繼承的菱形問題(顯示的都繼承乙個類,不是object類):新式類和經典類的查詢順序是不一樣的

新式類(py3中全是新式類):廣度優先---從左側開始,一直往上找,找到菱形的頂點結束(不包括菱形頂點),繼續下乙個繼承的父類往上找,找到菱形的頂點結束(不包括菱形頂點),最後找到菱形頂點

經典類(只有py2中才有):深度優先---從左側開始,一直往上找,找到菱形的頂點結束(包括菱形頂點)繼續下乙個繼承的父類往上找,找到菱形的頂點結束(不包含菱形定點)(經典類就是沒有繼承(object))

不出現菱形問題:正常查詢

繼承重用父親類方法1:指明道姓的使用,跟繼承沒有關係

class person:

school = 'oldboy'

def __init__(self,name,age):

self.name = name

self.age = age

def study(self):

print("study....")

class student(person):

def __init__(self,name,age,course):

#重用父類的__init__方法

person.__init__(self,name,age)

self.course = course

def study(self):

#重用父類的__init__方法

person.study(self)

print("%s學生在學習"%self.name)

stu1 = student('chen','18','python')

print(stu1.school)

stu1.study()

#oldboy

study....

chen學生在學習

繼承重用父類方法二:通過super關鍵字,跟繼承是有關係

class person(object):

school = 'oldboy'

def __init__(self,name,age):

self.name = name

self.age = age

def study(self):

print('study...')

class student(person):

def __init__(self,name,age,course):

#super()會按照mro列表拿出父親物件

#物件來呼叫繫結方法,不需要傳遞第乙個引數(self)

super().__init__(name,age)

#在新式類中一般都是上面的寫法

#在經典類(python2)中必須嚴格用另外一種方式寫,如下:

#super(student,self).__init__(name,age)這種方式也可以在python3種使用

self.course = course

def study(self):

super().study()

stu = student('ocera',18,'python')

print(stu.school)

stu.study()

#oldboy

study...

總結

先找物件---->到類中尋找------>父類中找(多繼承)-------->都找不到進行報錯

新式類 經典類與多繼承

python3所有的類都繼承自object類 新式類 1.python3中,所有類都是新式類 2.python2中主動繼承object類 經典類 python2中,不繼承object類 多繼承 class a pass class b a pass b繼承a class c a pass c繼承a ...

python3 class寫法 新式類 經典類

經典類與新式類 python2和python3中新式類 經典類 舊式類 的區別 python新式類與經典類的區別 經典類 不由任意內建型別派生出的類 新式類 由任意內建型別派生出的類 只要乙個內建型別位於類樹的某個位置 python2.1 只有經典類 python2.2 引入新式類 python3 ...

python044 (多繼承04 新式類和經典類)

object是python為所有物件提供的基類,提供有一些內建的屬性和方法,可以使用dir函式檢視 在python3.x中定義類時,如果沒有指定父類,會預設使用object作為該類的基類 python3.x中定義的類都是新式類 在python2.x中定義類時,如果沒有指定父類,則不會以object作...