37 通過例項方法名字的字串呼叫方法

2021-10-02 09:16:51 字數 3304 閱讀 2620

某專案中,**使用了三個不同庫中的圖形類:circle********rectangle,它們都有乙個獲取圖形面積的介面(方法),但方法名字不同。

要求:實現乙個統一的獲取面積的函式,使用各種方法名進行嘗試,呼叫相應類的介面。

解決方案:

使用內建函式getattr(),通過名字獲取方法物件,然後呼叫。

使用標準庫operator下的methodcaller()函式呼叫。

getattr

(object

, name[

, default]

)

返回物件命名屬性的值。name必須是字串。如果該字串是物件的屬性之一,則返回該屬性的值。例如getattr(x, 'foobar')等同於x.foobar。如果指定的屬性不存在,且提供了default值,則返回它,否則觸發attributeerror。

>>

> s =

'abc123'

>>

> s.find(

'123')3

>>

>

getattr

(s,'find'

,none)(

'123'

)#等同於s.find('123')

3

operator.methodcaller(name[

, args...

])

methodcaller()函式會返回乙個可呼叫物件,該物件在其運算元上呼叫方法名。如果提供了額外的引數或關鍵字引數,它們也將被提供給方法。

>>

>

from operator import methodcaller

>>

> s =

'abc123abc456'

>>

> s.find(

'abc',3

)6>>

> methodcaller(

'find'

,'abc',3

)(s)

#等價於s.find('abc', 3)

6

lib1.py

class

********

:def

__init__

(self, a, b, c)

: self.a, self.b, self.c = a,b,c

defget_area

(self)

: a,b,c = self.a, self.b, self.c

p =(a+b+c)/2

return

(p *

(p-a)

*(p-b)

*(p-c))**

0.5

lib2.py

class

rectangle

:def

__init__

(self, a, b)

: self.a, self.b = a,b

defgetarea

(self)

:return self.a * self.b

lib3.py

import math

class

circle

:def

__init__

(self, r)

: self.r = r

defarea

(self)

:return

round

(self.r **

2* math.pi,

1)

from lib1 import ********

from lib2 import rectangle

from lib3 import circle

defget_area

(shape, method_name =

['get_area'

,'getarea'

,'area'])

:for name in method_name:

f =getattr

(shape, name,

none

)if f:

return f(

)shape1 = ********(3,

4,5)

shape2 = rectangle(4,

6)shape3 = circle(2)

shape_list =

[shape1, shape2, shape3]

area_list =

list

(map

(get_area, shape_list)

)print

(area_list)

[6.0,24

,12.6

]#結果

from lib1 import ********

from lib2 import rectangle

from lib3 import circle

from operator import methodcaller

defget_area

(shape, method_name =

['get_area'

,'getarea'

,'area'])

:for name in method_name:

ifhasattr

(shape, name)

:return methodcaller(name)

(shape)

shape1 = ********(3,

4,5)

shape2 = rectangle(4,

6)shape3 = circle(2)

shape_list =

[shape1, shape2, shape3]

area_list =

list

(map

(get_area, shape_list)

)print

(area_list)

[6.0,24

,12.6

]#結果

例項方法名字的字串呼叫方法

通過例項方法名字的字串呼叫方法 我們有三個圖形類 circle,rectangle 他們都有乙個獲取圖形面積的方法,但是方法名字不同,我們可以實現乙個統一 的獲取面積的函式,使用每種方法名進行嘗試,呼叫相應類的介面 import math class def init self,a,b,c self...

python 通過方法名字的字串呼叫方法

from lib1 import circle from lib2 import from lib3 import rectangle from operator import methodcaller defget area shape,method name area get area geta...

字串的方法例項

s spammy s s 3 xx s 5 s spaxxy 使用以上只能替換或者修改特定的長度的字串 s spammy s.replace pa ww s swwmmy 如果你需要修改乙個字串的多處時。以上的方法顯然以上兩種方法並不夠用。此時我們需要用到例外乙個引數list 使用如下 s spam...