12

请考虑以下 Python 模块摘录:

foo.py:

class Foo:
  (...)

酒吧.py:

import foo

foo = foo.Foo()

变量 foo 是一个模块对象,被 Foo 对象覆盖。

我知道我可以为对象使用其他名称,例如:

foobar = foo.Foo()

但从语义上讲,在我的代码中将它称为 foo 更有意义,因为它将是唯一的实例。

(我试图通过删除类并仅使用模块来解决此问题,但我又回到使用类,因为使用模块只有“健壮性”问题。)

这是一个哲学问题,但是处理这种潜在的对象/模块名称冲突的“正确”方法是什么?

4

3 回答 3

8

在我看来,您目前正在做的事情没有任何问题,但为了让每个阅读代码的人更清楚,我建议您将代码更改为如下所示:

import foo as foo_mod

foo = foo_mod.Foo()

或者:

from foo import Foo

foo = Foo()

这可以防止名称冲突,因此foo模块中的变量不会引用同名模块会更加明显。

于 2013-04-03T23:14:11.577 回答
0

我现在也一直喜欢以下风格:

import foo

my_foo = foo.Foo()

我更喜欢这个,因为它保持模块名称不变,而且它们比局部变量更全局和更神圣。

于 2019-05-12T12:09:18.867 回答
0

这种模式似乎不会打扰使用Flask + Celery的窥视者,

from celery import Celery

def make_celery(app):
    celery = Celery(
        app.import_name,
        backend=app.config['CELERY_RESULT_BACKEND'],
        broker=app.config['CELERY_BROKER_URL']
    )
    ...

显然,创建这个类的实例的正确方法是stalk = Celery()(呵呵)

于 2020-05-01T17:13:20.990 回答