覆盖 __init__.py 中的 len - python

Overriding len in __init__.py - python

我想通过以下方式为我的包的 __init__.py 文件中的 len 分配另一个函数:

llen = len
len = lambda x: llen(x) - 1

它工作正常,但只在 __init__.py 文件中。我怎样才能让它影响我包中的其他模块?

这可能不是您正在寻找的答案,但如果我是您,我不会这样做(而且我敢肯定,无论如何您都做不到)。

您不应该这样做的原因是 python 在其对象内部使用 len 来执行某些操作。 另一个原因是纯粹的破坏逻辑。上面定义的 len 函数将 return 一个 负长度 用于空列表或空的东西。这对我来说似乎很糟糕。

可以 做的是仅在某些 class 上覆盖长度方法(这对您来说可能很有意义)。为此,您可以使用运算符重载,只需覆盖 class:

中的方法 __len__
class MyList(object):
    def __len__(self,):
        # Do your thing

您可能还想查看 meta classes,关于这个主题有一个很好的 stack overflow 问题。

当您尝试加载未定义为模块级全局或函数局部的名称时,Python 在 __builtin__(builtins 中查找它 Python 3)模块。在 Python 的两个版本中,此模块在全局范围内也可用作 __builtins__。您可以修改此模块,这不仅会影响您的代码,还会影响任何在您的代码运行后运行的 python 代码!!

import __builtin__ as builtins # import builtins in python 3
llen = len
builtins.len = lambda a:llen(a) - 1