修改内置功能

时间:2016-01-05 15:54:25

标签: python python-3.x override built-in

让我们考虑任何用户定义的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)))

但逃避无限递归。

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

2 个答案:

答案 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'] 的所有来电都将被过滤。正如您所看到的 - 它适用于所有类型,包括内置类型。