我想在我的包的
它可以正常工作,但仅限于
__init__.py
文件中给len分配另一个功能,方法如下:llen = len
len = lambda x: llen(x) - 1
它可以正常工作,但仅限于
__init__.py
文件中。我该如何使其影响我包中的其他模块?__init__.py
文件中给len分配另一个功能,方法如下:llen = len
len = lambda x: llen(x) - 1
__init__.py
文件中。我该如何使其影响我包中的其他模块?这可能不是你想要的答案,但如果我是你,我不会这样做(而且我相当确定你也不能轻易地这样做)。
你不应该这样做的原因是,Python 在其对象上内部使用 len
来执行某些操作。另一个原因是纯粹的错误逻辑。你上面定义的 len
函数将为空列表或空内容返回一个负长度。在我看来,这似乎很糟糕。
你可以做的是仅覆盖某些类的长度方法(这对你来说可能很有意义)。为此,你可以使用运算符重载,只需在你的类中覆盖方法 __len__
:
class MyList(object):
def __len__(self,):
# Do your thing
你可能还想研究元类,这个主题在stackoverflow上有一个非常好的问题。
当您尝试加载未定义为模块级全局变量或函数本地变量的名称时,Python会在__builtin__
(在Python 3中为builtins
)模块中查找。在Python的两个版本中,该模块也可以在全局范围内使用__builtins__
。您可以修改此模块,这将不仅影响您的代码,而且还会影响在您的代码运行之后任何地方运行的任何Python代码!
import __builtin__ as builtins # import builtins in python 3
llen = len
builtins.len = lambda a:llen(a) - 1
__builtins__
是CPython中的私有实现细节。您应该明确导入builtins
模块(或Python 2中的__builtin__
)来代替。 - pppery