繁体   English   中英

修改内置功能

[英]Modifying built-in function

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

['__class__', '__delattr__', '__dict__', '__dir__', ... '__weakref__', 'bases', 
'build_full_name', 'candidates', ... 'update_name'].

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

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

我需要覆盖__dir__所以它只返回用户定义的attribltes。 我怎么能这样做?

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

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

但逃避无限递归。

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

使用super调用parent的__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

>>> dir(AClass())
['method']

您想在自定义类上执行此操作还是在dir()函数中全局执行此操作?

第一种方法(仅限于类):

class MyClass:
    def f(self):
        return None

    def __dir__(self):
        return list(filter(lambda x: not re.match('__\S*__', x), super().__dir__()))


print(dir(MyClass()))  # ['f'] 

基本上这里做的是调用超类的__dir__() (不是类本身)并在子类中过滤它。

第二种方法(阴影全局目录函数):

import re


def dir(obj):
    return list(filter(lambda x: not re.match('__\S*__', x), __builtins__.dir(obj)))

print(dir({}))  # ['clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']

这里所有对dir()调用都将被过滤掉。 如您所见 - 它适用于所有类型,包括内置类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM