Python繼承和反射

2021-08-20 09:40:36 字數 4518 閱讀 9812

反射

classa:

def__init__

(self, a)

: self.a = a

defget_a

(self)

:print

(self.a)

classb:

def__init__

(self, b)

: a.__init__(self, b)

print

('\n'

.join(i for i in

dir(b(

'a'))if

not i.startswith(

'_')

))

a

classa:

def__init__

(self, a)

: self.a = a

defget_a

(self)

:print

(self.a)

class

b(a)

:def

__init__

(self, b)

: a.__init__(self, b)

print

('\n'

.join(i for i in

dir(b(

'a'))if

not i.startswith(

'_')

))

a

get_a

classa:

def__init__

(self)

: self.a =

1def

get_a

(self)

:print

(self.a)

class

aa(a)

:def

__init__

(self, aa)

:super()

.__init__(

) self.aa = aa

class

b(aa)

:def

__init__

(self, aa, b)

:super()

.__init__(aa)

self.b = b

print

('\n'

.join(i for i in

dir(b(

'a',

'b'))if

not i.startswith(

'_')

))

aaab

get_a

可以看到super().__init__()b.__init__(self)有區別

classa:

def__init__

(self)

: self.a =

1def

get_a

(self)

:print

(self.a)

classb:

def__init__

(self)

: self.b =

2def

get_b

(self)

:print

(self.b)

class

c(a, b)

:def

__init__

(self, c)

:super()

.__init__(

) self.c = c

print

('\n'

.join(i for i in

dir(c(3)

)ifnot i.startswith(

'_')

))

a

cget_a

get_b

classa:

def__init__

(self)

: self.a =

1def

get_a

(self)

:print

(self.a)

classb:

def__init__

(self)

: self.b =

2def

get_b

(self)

:print

(self.b)

class

c(a, b)

:def

__init__

(self, c)

: a.__init__(self)

b.__init__(self)

self.c = c

print

('\n'

.join(i for i in

dir(c(3)

)ifnot i.startswith(

'_')

))

abc

get_a

get_b

即把字串反射成記憶體物件;使用hasattr和getattr

示例:英雄繼承小兵,並擴充套件新技能

from collections import deque

# 小兵

class

dogface

:def

__init__

(self, name, hp=

100)

: self.name = name

self.hp = hp

self.menu = deque([(

'攻擊'

,'attack'),

('返回'

,'back'),

('退出'

,'disconnect')]

)def

attack

(self)

:print

('attack'

)def

back

(self)

: self.menu =

none

defdisconnect

(self)

: exit(

'disconnect'

)# 列印

defshow_menu

(self)

:while self.menu:

for e, i in

enumerate

(self.menu)

:print

(e +

1, i[0]

)try

: n =

int(

input

('選擇數字: '

).strip())

choice = self.menu[n -1]

[1] funct =

getattr

(self, choice,

'not found'

) funct(

)except exception as error:

print

(error)

# 英雄

class

hero

(dogface)

:def

__init__

(self, name, hp=

100, mp=10)

:super()

.__init__(name, hp)

self.mp = mp

self.menu.extendleft([(

'回血'

,'treat'),

('法術'

,'magic')]

)def

treat

(self)

:print

('treat'

, self.hp)

defmagic

(self)

:print

('magic'

, self.mp)

if __name__ ==

'__main__'

: h = hero(

'劍聖'

) h.show_menu(

) d = dogface(

'苦工'

) d.show_menu(

)print

('back'

)

python基礎 反射和異常

反射 通俗的說就是你給乙個字串,我就能匹配到和字串相同的函式進行呼叫 反射舉例說明 def bulk self print s is yelling self.name class dog object def init self,name self.name name defeat self,fo...

python 反射 python中的反射

什麼是反射?有時我們要訪問某個變數或是方法時並不知道到底有沒有這個變數或方法,所以就要做些判斷。判斷是否存在字串對應的變數及方法。我們知道訪問變數時是不能加引號的,否則會被當成字串處理。如果要通過字串找到對應的變數,那該怎麼辦呢 反射就是用於解決上面兩個問題而產生的,所謂反射,按我的理解就是反過來告...

python反射例項化 python反射

定義 通過字串的形式去操作物件 類,例項物件,模組中的物件 中的成員 增刪改查 叫反射。一 類例項物件class foo tests test def init self,name,age self.name name self.age age def show self return s s se...