Maison >développement back-end >Tutoriel Python >appels python par nom de méthode d'instance

appels python par nom de méthode d'instance

小云云
小云云original
2018-03-29 13:33:461912parcourir

Cet article présente principalement en détail comment python appelle les méthodes via les noms de méthodes d'instance. Il a une certaine valeur de référence. Les amis intéressés peuvent s'y référer. J'espère qu'il pourra aider tout le monde.

Cas :

Dans un certain projet, notre code utilise des classes graphiques de 2 bibliothèques différentes :

Cercle,Triangle

Il existe une interface de méthode pour obtenir la zone dans les deux classes, mais les noms des interfaces sont différents

Exigences :

Unifiez ces interfaces et ne vous en souciez pas l'interface spécifique, tant que j'appelle l'interface unifiée, la surface correspondante sera calculée

Comment résoudre ce problème ?

Définissez une fonction d'interface unifiée et effectuez des appels d'interface par réflexion : getattr

#!/usr/bin/python3
 
from math import pi
 
 
class Circle(object):
  def __init__(self, radius):
    self.radius = radius
 
  def getArea(self):
    return round(pow(self.radius, 2) * pi, 2)
 
 
class Rectangle(object):
  def __init__(self, width, height):
    self.width = width
    self.height = height
 
  def get_area(self):
    return self.width * self.height
 
 
# 定义统一接口
def func_area(obj):
  # 获取接口的字符串
  for get_func in ['get_area', 'getArea']:
    # 通过反射进行取方法
    func = getattr(obj, get_func, None)
    if func:
      return func()
   
 
if __name__ == '__main__':
  c1 = Circle(5.0)
  r1 = Rectangle(4.0, 5.0)
   
  # 通过map高阶函数,返回一个可迭代对象
  erea = map(func_area, [c1, r1])
  print(list(erea)) 

Appel via la méthode methodcaller dans l'opérateur de bibliothèque standard

#!/usr/bin/python3
 
from math import pi
from operator import methodcaller
 
 
class Circle(object):
  def __init__(self, radius):
    self.radius = radius
 
  def getArea(self):
    return round(pow(self.radius, 2) * pi, 2)
 
 
class Rectangle(object):
  def __init__(self, width, height):
    self.width = width
    self.height = height
     
  def get_area(self):
    return self.width * self.height
 
if __name__ == '__main__':
  c1 = Circle(5.0)
  r1 = Rectangle(4.0, 5.0)
   
  # 第一个参数是函数字符串名字,后面是函数要求传入的参数,执行括号中传入对象
  erea_c1 = methodcaller('getArea')(c1)
  erea_r1 = methodcaller('get_area')(r1)
  print(erea_c1, erea_r1)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn