1

我在同一个目录中有三个 Python 模块。在其中两个文件中是我要访问的类。我的印象是,如果我的模块之一(称为枚举)中有以下代码:

class Directions:

    UP = 1
    DOWN = 2
    LEFT = 3
    RIGHT = 4

class Colors:
    RED = [255, 0, 0]

我可以使用以下语句:

from enum import Directions
from enum import Colors

能够像这样访问类成员:

foo = DOWN
bar = RED

但是,我必须像这样访问它们

foo = Directions.DOWN
bar = Colors.RED

否则会产生错误。有什么方法可以使用 import/from-import 语句来访问我的类成员而无需指定类名?还是我应该以不同的方式组织我的“枚举”?

4

4 回答 4

5

除了该类定义内部之外,不可能直接从代码访问类成员。

尝试将您的枚举模块更改为以下内容:

__all__ = ['UP', 'DOWN', 'LEFT', 'RIGHT', 'RED']

# Directions
UP = 1
DOWN = 2
LEFT = 3
RIGHT = 4

# Colors
RED = [255, 0, 0]

然后from enum import *在您想要访问这些变量的模块内部使用。

在这里定义__all__不是必需的,但无论如何使用它是一个好习惯。它控制使用时导入from foo import *的名称。

于 2013-04-05T22:46:27.693 回答
3

以不同的方式组织它们。没有直接的方法可以按照您的要求进行操作。

另一方面,引用Directions.DOWNandColors.RED是非常 Pythonic 的。它是显式的(DOWN指的是 a Direction,而不是 a MattressStuffing)并使用命名空间来包含数据(Colors.RED不同于Alerts.RED)。这些都是好事。

于 2013-04-05T22:47:11.847 回答
2

如果您的课程与您在此处发布的内容一样简单,那么它们就没有必要成为真正的课程。但是,要使用您拥有的代码获得您想要的东西,您需要这样做:

from enum import Directions
from enum import Colors

foo = Directions()    # This is called instantiation
foo.DOWN

bar = Colors()    # You can potentially instantiate as many of these as you want
bar.RED

rab = Colors()
rab.RED    # Try it, you'll see

类并不是真正打算像您那样保存静态变量,但是这段代码就是它的工作方式。

Python应该使您的代码工作的原因是因为以下示例:

class Directions:

    UP = 1
    DOWN = 2
    LEFT = 3
    RIGHT = 4


class Directions2:

    UP = 9
    DOWN = 8
    LEFT = 7
    RIGHT = 6

然后你导入

from enum import Directions
from enum import Directions2

如果你然后尝试使用foo = DOWN,那么 Python 怎么知道DOWN你在说什么?这个基本概念的技术术语是命名空间

于 2013-04-05T22:59:16.453 回答
1
from enum import Directions

Directions这将从模块中导入名称enum。内部发生了什么,内部导入函数实际上会将局部变量设置Directions为以这种方式导入的任何内容。特别是,它不会设置任何其他局部变量——这正是您使用该from..import语法的原因,因此您可以完全控制设置的名称。

所以像这样使用它,你就无法获取变量DOWNRED设置。

如果您想使用它们,则需要直接导入它们,即,from <something> import DOWN, RED或者from <something> import *如果您只想导入所有内容(通常不鼓励这样做)。

现在来说说这<something>部分;您无法导入类型的属性,因此您必须以enum某种方式更改您的模块。一种冗长的可能性是将每种类型更改DirectionsColors单独的模块,因此您可以这样做from enum.Directions import DOWN

另一种可能性是直接在 enum 模块中公开这些变量,例如:

class Directions:
    UP = 1
    DOWN = 2
    LEFT = 3
    RIGHT = 4

UP = Directions.UP
DOWN = Directions.DOWN
LEFT = Directions.LEFT
RIGHT = Directions.RIGHT

当然,如果你甚至需要那种Directions类型,你可以争论。通常,您实际上只想导入Directions并明确使用Directions.UPetc. 指定每个枚举值,因此您实际上知道您指的是哪种枚举。

于 2013-04-05T22:48:12.730 回答