物件導向之反射運用

2022-09-06 21:15:38 字數 3319 閱讀 7509

import

sysclass

apache(object):

def__init__

(self, tcp):

self.tcp =tcp

defstart(self):

print("

apache is starting,host id is [%s]

" %self.tcp)

defstop(self):

print("

apache is stoping,host id is [%s]

" %self.tcp)

defrestart(self):

self.stop()

self.start()

if__name__ == '

__main__':

server = apache("

333"

)

if hasattr(server, "

start

"): #

判斷例項中是否有ays.ar**[1]這個方法

func = getattr(server, "

start

") #

獲取server.sys.ar**[1]方法的記憶體位址

func() #

執行server.sys.ar**[1]這個方法

import

sysclass

apache(object):

def__init__

(self, tcp):

self.tcp =tcp

print

(tcp)

defstart(self):

print("

apache is starting,host id is [%s]

" %self.tcp)

defstop(self):

print("

apache is stoping,host id is [%s]

" %self.tcp)

defrestart(self):

self.stop()

self.start()

deftest_run(name):

print("

running

", name)

if__name__ == '

__main__':

server = apache("

333"

) setattr(server,

"run

", test_run) #

相當於:server.run = test_run 賦值操作,這一步操作之後那麼test_run函式就屬於apache類

#我們可以看到,本來server這個例項本身是沒有test_run這個方法的,且test_run和apache這個類根本就沒有任何關係,但是我們通過setattr方法,就可以把外面的函式賦值給

#某個例項,比如這裡的例子,我們就把函式test_run的記憶體位址賦值給了server.run,也就是說test_run == server.run

#注意,這裡只繫結到server這例項上,其他例項還是不能用test_run這個方法的

server.run("

alex

") #

這裡其實呼叫的是test_run這個方法

#上面的例子中,在test_run中不能使用例項變數,我們可以通過下面的方法就可以實現test_run函式可以呼叫例項變數

#定義函式需要按照下面的格式來定義

deftest_run(self, name):

print("

running

", name, self.tcp)

if__name__ == '

__main__':

server = apache("

333"

) setattr(server,

"run

", test_run)

#呼叫的時候需要這樣呼叫

server.run(server, "

alex

")

import

sysclass

apache(object):

def__init__

(self, tcp):

self.tcp =tcp

defstart(self):

print("

apache is starting,host id is [%s]

" %self.tcp)

defstop(self):

print("

apache is stoping,host id is [%s]

" %self.tcp)

defrestart(self):

self.stop()

self.start()

if__name__ == '

__main__':

server = apache("

1000")

#delattr(server,"stop")

#server.stop()

#這樣的寫法是錯誤的,因為stop這個方法不屬於物件,而屬於類,所以刪除物件中的stop方法肯定是不可以的

print

(server.tcp)

#1000

#delattr(server,"tcp")

#print(server.tcp)

#所以如果我們刪除物件的話,只能刪除物件的變數,上面這個例子,我們就可以刪除物件中的變數,然後在列印就發現沒有這個值了

#所以如果要刪除方法,那麼我們只能刪除類的方法,而不能刪除物件的方法,因為方法都是屬於類的

#在刪之前我們先判斷一下物件中是否有stop這個方法

if hasattr(apache, "

stop"):

print

(true)

else

:

print

(false)

#true 結果證明有stop這個方法

#在刪之後我們在判斷一下物件中是否有stop這個方法

delattr(apache, "

stop")

if hasattr(apache, "

stop"):

print

(true)

else

:

print

(false)

#false 結果證明沒有stop這個方法

物件導向之反射

反射 python中的反射功能是由以下四個內建函式提供 hasattr getattr setattr delattr,改四個函式分別用於對物件內部執行 檢查是否含有某成員 獲取成員 設定成員 刪除成員。class foo object def init self self.name wupeiqi...

物件導向之反射

isinstance與issubclass是python的內建模組 isinstance class foo pass class boo pass foo obj foo boo obj boo print isinstance foo obj,foo true print isinstance ...

物件導向 反射

內建函式 1.isinstance 判斷乙個物件和乙個類有沒有血緣關係class a pass class b a pass a b print isinstance a,b true print isinstance a,a true print type a is b true print ty...