python程式設計 單繼承

2021-10-03 06:52:04 字數 4869 閱讀 7972

繼承的作用

貓類和狗類都是動物類,但是又各有區別。如果沒有繼承,那麼貓類和狗類就都需要建立各自的方法;如果它們都繼承自動物類,那麼很多共同的地方就只需要在動物類中定義一次即可,精簡了**。

繼承前

繼承前,各個類都需要自己定義自己的方法,**不夠精簡

class

animal

:def

shout

(self)

:print

('animal shouts')

a = animal(

)a.shout(

)class

cat:

#未繼承animal類,要重新定義自己的方法

defshout

(self)

:print

('cat shouts'

)c = cat(

)c.shout(

)class

dog:

defshout

(self)

:print

('dog shout'

)d = dog(

)d.shout(

)

繼承後

有了繼承之後,子類只需要呼叫父類的方法就行

class

animals

:def

__init__

(self, name)

: self._name = name

defshouts

(self)

:return

'{} shouts'

.format

(self._name)

class

cat(animals)

:pass

class

dog(animals)

:pass

dog_a = dog(

'wangcai'

)tom_cat = cat(

'tom'

)print

(tom_cat.shouts())

print

(dog_a.shouts(

))

基類

所有物件的根基類都是object,可以通過以下方式來檢視基類或子類

特殊屬性或方法

含義示例

__base__

類的基類

__bases__

類的基類元組

__mro__

顯示方法查詢順序,基類的元組

mro()方法

同上,返回列表

int.mro()

__subclasses__()

類的子類列表

int.__subclasses__()

繼承中的訪問控制

1.子類可以繼承父類中的變數

2.子類可以直接訪問父類中的公有成員和保護成員

3.保護成員的格式為_name,以單下劃線開頭

4.對於私有成員__name(以雙下劃線開頭),子類訪問時需要根據規則改變相應成員的名稱。

4.改名規則為:在保護成員前面加上_a,比如保護成員__a,子類繼承父類a,子類在訪問a類中的成員時,需要將識別符號的名稱改為_a__a

classa:

__a =

1 _b =

2 c =

3def

__init__

(self)

: self.__d =

4 self._e =

5 self.f =

6 self.__a +=

1def

showa

(self)

:print

(self.__a)

print

(self.__class__.__a)

def__showb

(self)

:print

(self._b)

print

(self.__a)

print

(self.__class__.__a)

class

b(a)

: __a =

11 _b =

12x = b(

)#b類沒有init方法,因此會呼叫父類的

x.showa(

)#由於初始化時呼叫的時父類的方法,因此,再呼叫__a時,需要加上1

print

(x._a__showb())

#私有成員需要改名訪問

print

(x.c)

print

(x._animal__d)

#改名訪問

print

(x.__dict__)

print

(x.__class__.__dict__.keys(

))

例項屬性查詢順序

例項的__dict__ --> 類的__dict__ --> 如果有繼承:父類的__dict__

一旦找到即返回,如果都沒找到就會跑異常

方法的重寫override

子類中的可以覆蓋父類中的同名方法,而且也可以覆蓋本類中的同名方法,因為方法名只是個識別符號,可以依次覆蓋

class

animals

:def

__init__

(self, name)

: self._name = name

defshouts

(self)

:return

'animals shouts'

class

cat(animals)

:def

shouts

(self)

:return

'{} shout'

.format

(self._name)

tom_cat = cat(

'tom'

)print

(tom_cat.shouts())

#雖然繼承自animals類,但是子類中包含同名方法,因此會覆蓋父類

方法增強super()

子類繼承自父類,但父類的方法不一定完全滿足子類,因此子類可以在父類方法的基礎上做一些增強,相當於追加新的特性,而且不覆蓋父類原有的特性。

super().method()  #這樣就呼叫了父類的方法,能夠使用父類方法,並且自己的特性不會被覆蓋
class

animals

:def

__init__

(self, name)

: self._name = name

defshouts

(self)

:print

('animals shouts'

)class

cat(animals)

:def

shouts

(self)

:print

('hahah'

)#子類方法的功能

super()

.shouts(

)#呼叫父類方法的功能

tom_cat = cat(

'tommy'

)tom_cat.shouts(

)#這樣就可以執行父類和子類方法所包含的所有功能

super()方法可以訪問到父類的屬性,是一種靜態方法和類方法,也是類屬性

子類初始化方法

1.如果父類已經定義了__init__方法,再在子類中定義__init__方法的話會覆蓋父類的方法,所以子類應該使用super()方法類顯式呼叫父類的初始化方法

2.子類中顯式呼叫父類初始化方法的位置越靠前越好

classa:

def__init__

(self, a, d=10)

: self.a = a

self.__d = d

class

b(a)

:def

__init__

(self, b, c)

:#a.__init__(self, b + c, b - c) #呼叫父類初始化方法

super()

.__init__(

)#同上

self.b = b

self.c = c

defget_values

(self)

:print

(self.b)

print

(self.a)

f = b(

200,

300)

print

(f.__dict__)

print

(f.__class__.__bases__)

f.get_values(

)

在顯式呼叫父類初始化方法時,推薦使用一下兩種方式

super().__init__()

super(b, self).__init__()

python 單繼承,多繼承

父類 class person def init self,name,age self.name name self.self.age age def introduce self print 父類方法person self.name 學生類 繼承 person class student pers...

Python單繼承案例

class animal def eat self print 吃 def drink self print 喝 def run self print 跑 def sleep self print 睡 class dog animal animal的子類 派生類 def bark self prin...

Python之繼承(概念,單繼承,多繼承)

父類 class 父類類名 object 類體 公共部分 子類 class 子類類名 父類類名 類體 子類特有的部分 定義父類 注意 如果沒有顯示的規定父類,則這個類的父類預設為object class person object 成員變數 def init self,name,age self.n...