让我们考虑任何用户定义的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)))
但逃避无限递归。
一般情况下,如果我不想从头开始编写但想要修改现有功能,如何修改内置函数?
答案 0 :(得分: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
>>> dir(AClass())
['method']
答案 1 :(得分:2)
您想在自定义类上执行此操作还是在Starting NodeJS cartridge
Tue Jan 05 2016 10:49:19 GMT-0500 (EST): Starting application 'squadstream' ...
Waiting for application port (8080) become available ...
Application 'squadstream' failed to start (port 8080 not available)
-------------------------
Git Post-Receive Result: failure
Activation status: failure
Activation failed for the following gears:
568be5b67628e1805b0000f2 (Error activating gear: CLIENT_ERROR: Failed to
execute: 'control start' for /var/lib/openshift/568be5b67628e1805b0000f2/nodejs
#<IO:0x0000000082d2a0>
#<IO:0x0000000082d228>
)
Deployment completed with status: failure
postreceive failed
函数中全局执行此操作?
第一种方法(仅限课程):
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']
的所有来电都将被过滤。正如您所看到的 - 它适用于所有类型,包括内置类型。