在examp中使用python关键字“as”

2024-04-29 14:56:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到了如下代码:

import redis
import redis as originalRedis

OriginalRedis = originalRedis.Redis          # note the uppercase O 
class Redis(redis.Redis):

    def keys(self, pattern='*'):
        # custom implementation to be done here
        client = OriginalRedis(self.host, port=self.port, db=self.db)
        return client.keys(pattern)

    def flushKeys(self):
        # some custom implementation TBD here too
        return True

redis.Redis = Redis

现在我的问题是关于进口的声明。当我们导入这样的东西时,我们是否要对同一个模块进行两个引用? 模块导入不应该是单例对象吗?我试过以下方法

^{pr2}$

所以我猜有一个对单个模块的引用,因为id(dt)和{}是相同的。有人能详细解释一下为什么要用这种方法吗?提前谢谢!在


Tags: 模块importselfredisclienthereportdef
2条回答

我认为操作是混淆了实例和引用!在

When we import something like that do we've two references to the same module?

import datetime
import datetime as dt 

是的。但您还应该了解对象/实例与引用不同(显然您现在已经知道这一点了!)。我认为OP认为多个导入将有点del以前对模块的引用(因此使以前的导入过时),并创建一个新的导入,但事实并非如此!请自己查看下面的代码,并确保这一点。在

^{pr2}$

Aren't module imports supposed to be singleton objects?

是的。而且没有任何语言禁止您创建对同一个singleton对象的任意数量的引用!在

注意:有些OP只是像我这样的人,甚至是我!在

谢谢大家!在

When we import something like that do we two references to the same module?

正确。as子句所做的就是将一个新名称绑定到一个对象。如果您直接导入一个模块,然后通过as导入同一个模块但名称不同,则两个名称将指向完全相同的对象。例如:

>>> import re
>>> import re as regex
>>> 
>>> id(re) == id(regex)
True

>>>

documentation for ^{} statements also mentions this behavior

If the module name is followed by as, then the name following as is bound directly to the imported module.


Aren't module imports supposed to be singleton objects?

是的,你可以这样想。Python只在需要时执行导入模块的代码,所以从技术上讲是的。模块对象是单例对象。但你必须记住,即使是单身汉也可以有多个名字。在

仅仅因为您为一个对象创建了一个新别名,并不意味着您创建了一个全新的对象。您所做的只是创建一个新名称来引用完全相同的对象。如果这不是真的,那么上面的代码将返回False作为re和{}是不同的对象

相关问题 更多 >