[英]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.