Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用from import语句,但仍必须在Python 3中输入类名_Python_Import_Python 3.x_Module - Fatal编程技术网

使用from import语句,但仍必须在Python 3中输入类名

使用from import语句,但仍必须在Python 3中输入类名,python,import,python-3.x,module,Python,Import,Python 3.x,Module,我在同一目录中有三个Python模块。在这两个文件中,有两个是我试图访问的类。我的印象是,如果我在一个名为enum的模块中有以下代码: class Directions: UP = 1 DOWN = 2 LEFT = 3 RIGHT = 4 class Colors: RED = [255, 0, 0] 我可以使用以下语句: from enum import Directions from enum import Colors 能够像这样访问类成员

我在同一目录中有三个Python模块。在这两个文件中,有两个是我试图访问的类。我的印象是,如果我在一个名为enum的模块中有以下代码:

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语句访问我的类成员,而不必指定类名?或者我应该以不同的方式组织我的枚举吗?

除了类定义内部之外,不可能从任何地方的代码直接访问类成员

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

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

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

# Colors
RED = [255, 0, 0]
然后在您希望访问这些变量的模块内部使用from enum import*


这里不需要定义uuu all uuuu,但无论如何使用它都是一种很好的实践。它控制使用from foo import*时导入的名称。

不可能直接从该类定义内部以外的任何地方的代码访问类成员

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

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

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

# Colors
RED = [255, 0, 0]
然后在您希望访问这些变量的模块内部使用from enum import*


这里不需要定义uuu all uuuu,但无论如何使用它都是一种很好的实践。它控制使用foo import*时导入的名称。

以不同的方式组织名称。没有直接的方法来满足你的要求


另一方面,指的是Directions.DOWN和Colors.RED是一种很好的python风格。它是显式向下的,指的是一个方向,而不是床垫填充,并使用名称空间来包含数据颜色。红色与Alerts.RED不同。这些都是好事。

以不同的方式组织它们。没有直接的方法来满足你的要求

from enum import Directions
另一方面,指的是Directions.DOWN和Colors.RED是一种很好的python风格。它是显式向下的,指的是一个方向,而不是床垫填充,并使用名称空间来包含数据颜色。红色与Alerts.RED不同。这些都是好事

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

所以像这样使用它,你就不能把变量放下并设置成红色

如果您想使用它们,您需要直接导入它们,即从导入向下、红色或从导入*,如果您只想导入通常不鼓励的所有内容

现在是角色;无法导入类型的属性,因此必须以某种方式更改枚举模块。一种详细的可能性是将每种类型的方向和颜色更改为单独的模块,这样您就可以从enum.Directions向下导入等操作

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

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

UP = Directions.UP
DOWN = Directions.DOWN
LEFT = Directions.LEFT
RIGHT = Directions.RIGHT
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
当然,如果你需要那种方向,你也可以争论。通常情况下,您实际上只需要导入方向,并使用Directions.UP等明确指定每个枚举值,这样您就可以真正了解所引用的枚举类型

这将从模块枚举导入名称方向。内部发生的情况是,内部导入函数实际上会将局部变量方向设置为以这种方式导入的任何对象。特别是,它不会设置任何其他局部变量,这正是您使用from..import语法的原因,因此您可以完全控制设置的名称

所以像这样使用它,你就不能把变量放下并设置成红色

如果您想使用它们,您需要直接导入它们,即从导入向下、红色或从导入*,如果您只想导入通常不鼓励的所有内容

现在是角色;无法导入类型的属性,因此必须以某种方式更改枚举模块。一种详细的可能性是将每种类型的方向和颜色更改为单独的模块,这样您就可以从enum.Directions向下导入等操作

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

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

UP = Directions.UP
DOWN = Directions.DOWN
LEFT = Directions.LEFT
RIGHT = Directions.RIGHT
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

当然,如果你需要那种方向,你也可以争论。通常情况下,您实际上只需要导入方向,并使用Directions.UP等明确指定每个枚举值,这样您就可以真正知道您所指的枚举类型。

如果您的类与您在此处发布的类一样简单,那么它们就不必是真正的类。但是,为了得到你想要的代码,你必须 需要这样做:

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

UP = Directions.UP
DOWN = Directions.DOWN
LEFT = Directions.LEFT
RIGHT = Directions.RIGHT
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呢?这个基本概念的技术术语是名称空间。

如果你的类和你在这里发布的一样简单,那么它们就没有必要是真正的类。但是,要使用现有的代码获得所需的内容,您需要这样做:

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

UP = Directions.UP
DOWN = Directions.DOWN
LEFT = Directions.LEFT
RIGHT = Directions.RIGHT
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呢?这个基本概念的技术术语是名称空间。

将这些变量放入类的原因是什么?Python没有内置的方法来创建枚举。我试图找到一种方法来创建自己的枚举,但是这个方法不起作用。为什么要将这些变量放入类中?Python没有内置的方法来创建枚举。我试图找到一种方法来创建自己的枚举,但这种方法不起作用。在这种情况下,您不需要定义uuu all。这对于不想暴露所有内容的情况更有用。这个答案+1。在这里,您真的不需要类,例如,您永远不会实例化它,而且似乎不需要对这些值进行分组/命名空间。我建议不要使用import*tho,而是显式地从enum import向上、向下导入所需的内容。这对于不想暴露所有内容的情况更有用。这个答案+1。在这里,您真的不需要类,例如,您永远不会实例化它,而且似乎不需要对这些值进行分组/命名空间。我建议不要使用import*tho,而是从enum import向上、向下显式导入所需的内容。当语言本身的设计考虑到最小的冗余度时,显式定义究竟有多像Pythonic?最小的冗余度不是Python的设计目标;最大的可读性是。当语言本身的设计考虑到最小的详细性时,显式定义究竟有多像Python?最小的详细性不是Python的设计目标;最大可读性为。