是否可以在python中的函数上使用模式匹配?就像,一个将响应多个调用的函数

时间:2019-05-25 00:11:36

标签: python oop

我正在尝试制作一个类似于列表的类。但是,我希望能够使用所有内置列表 repr ()函数等等,有什么办法可以做这样的事情:

class myList:
  ...
  def __getitem__(self, index):
    #custom getitem function
  def __setitem(self,index,value):
    #custom setitem function
  def toList(self):
    #returns a list

  #and a catch-all case:
  def __*__(*args):
    return self.toList().__*__(*args)

所以,我的问题是,是否有可能在python中对类似内容进行全面介绍,以捕获__repr__, __str__, __iter__之类的东西,等等。

谢谢!

1 个答案:

答案 0 :(得分:0)

至少在CPython中,不可能用一个方法来捕获此类调用。尽管您可以定义诸如__getattr__之类的特殊方法,但即使在元类上定义低级__getattribute__也不起作用,因为解释器会扫描特殊方法名称以建立快速查找表,以供使用类型defined in C。实际不具备此类单独方法的所有内容都不会响应解释器的内部调用(例如,来自repr例如)。

您可以做的是dynamically generate(或增加以下内容)一个具有所需特殊方法的类。结果的可读性可能会使该方法不值得一试:

def mkfwd(n):
  def fwd(self,*a): return getattr(self.toList(),n)(*a)
  return fwd
for m in "repr","str":
  m="__%s__"%m
  setattr(myList,m,mkfwd(m))