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

标签 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__等的东西

谢谢!

最佳答案

不可能用单个方法捕获此类调用,至少在 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))

关于python - 是否可以在 python 中的函数上使用模式匹配?就像一个可以响应多个调用的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56300707/

相关文章:

oop - 聚合、组合、关联、直接关联

c++ - 为什么它不会进入无限循环

python - 将文件从 Google Compute Engine VM 上运行的 docker 镜像复制到 Google Storage 存储桶

python -/usr/local/lib/python2.6和/usr/lib/python2.6有什么区别?

python - SQL BETWEEN 命令不适用于大范围

python - 为什么将 str.split(line) 写成 line.split() 有意义?

javascript - 在对象实例化时将变量名称传递给构造函数

php - 从静态方法中创建类实例

python - unittest.main() 运行包中的所有测试模块

python - 从字典的字典中创建一个内部值列表