修改内置功能

VeL*_*err 5 python overriding built-in python-3.x

让我们考虑任何用户定义的pythonic类.如果我打电话dir(obect_of_class),我会得到它的属性列表:

['__class__', '__delattr__', '__dict__', '__dir__', ... '__weakref__', 'bases', 
'build_full_name', 'candidates', ... 'update_name'].
Run Code Online (Sandbox Code Playgroud)

您可以在此列表中看到两种类型的属性:

  • 内置属性,
  • 用户自定义.

我需要覆盖__dir__它,它将只返回用户定义的attribltes.我怎么能这样做?

很明显,如果在重写函数中我自称,它会给我无限递归.所以,我想做这样的事情:

def __dir__(self):
        return list(filter(lambda x: not re.match('__\S*__', x), dir(self)))
Run Code Online (Sandbox Code Playgroud)

但逃避无限递归.

一般情况下,如果我不想从头开始编写但想要修改现有函数,如何修改内置函数?

fal*_*tru 8

使用super调用父的实现__dir__; 避免递归:

import re


class AClass:

    def __dir__(self):
        return [x for x in super().__dir__() if not re.match(r'__\S+__$', x)]

    def method(self):
        pass
Run Code Online (Sandbox Code Playgroud)
>>> dir(AClass())
['method']
Run Code Online (Sandbox Code Playgroud)

  • @VeLKerr,它不是生成器,而是列表理解。对我来说,阅读要容易得多。 (2认同)