【问题标题】:How to import global variables in python from a class module in another file?如何从另一个文件中的类模块导入python中的全局变量?
【发布时间】:2018-11-05 20:34:07
【问题描述】:

我有一个文件,其中包含我需要在主文件中使用的类定义和函数,以使文本更清晰。但是,我在导入全局变量时遇到了问题。

在 SO 和其他资源中有大量关于如何在同一代码中使函数变量成为全局变量或如何使用导入文件中的全局变量的信息。但是,如果变量属于属于某个类的函数,则没有关于如何从导入的文件中访问变量的信息。

我会很感激任何关于如何做或为什么不能做的帮助。请跳过关于使用这样的全局变量的危险的讲座,因为我的情况需要这样使用。

编辑:很抱歉在原始帖子中没有示例。这是我的第一个。以下是我正在尝试完成的示例。

假设我有一个文件 classes.py,其中包含:

class HelixTools():
    def calc_angle(v1, v2):
    v1_mag = np.linalg.norm(v1)
    v2_mag = np.linalg.norm(v2)

    global v1_v2_dot
    v1_v2_dot = np.dot(v1,v2)
    return v1_v2_dot

然后在我的主文本文件中执行:

from classes import HelixTools

ht = HelixTools()
v1 = some vector
v2 = some other vector
ht.calc_angle(v1,v2)
print(v1_v2_dot)

结果是“v1_v2_dot”未定义。我需要 v1_v2_dot 将其用作另一个函数的输入。

【问题讨论】:

  • 您需要提供minimal reproducible example。通常,您访问变量的方式与往常一样,使用适当的命名空间。所以如果你import mymodule,你会做类似mymodule.MyClass.some_class_var
  • 无论如何,尚不清楚“但是,如果变量属于属于某个类的函数,则没有关于如何从导入的文件中访问变量的信息。”这意味着。你是什​​么意思“变量属于一个函数”?如果它是一个局部变量,那么它在该函数之外是不可访问的。
  • 我根据您的问题更新了帖子。希望现在更有意义。
  • 为什么会有这个类?为什么不只使用模块级函数?为什么要有一个全局变量?
  • @user2357112 类成员模块计算分子结构的不同属性,但其中一些使用相同的输入。例如,原子位置列表可用于计算三个原子之间的角度或计算原子对向量之间的角度,这两者都是使用相同输入的独立函数。计算每个函数的原子列表是没有意义的。

标签: python class variables import


【解决方案1】:

这是一个如何访问类属性的示例(如果我理解您想要正确执行的操作)。假设您有一个名为“Test_class.py”的 Python 文件,其中包含以下代码:

class Foo(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def bar(self):
        self.z = self.x + self.y

现在假设您想将这个类导入到同一目录中的另一个 python 文件中,并访问该类的属性。你会这样做:

from Test_class import Foo

# Initialize two Foo objects
test1 = Foo(5, 6)
test2 = Foo(2, 3)

# Access the x and y attributes from the first Foo object
print(test1.x)  # This will print 5
print(test1.y)  # This will print 6

# Access the x and y attributes from the second Foo object
print(test2.x)  # This will print 2
print(test2.y)  # This will print 3

# Access the z attribute from the first Foo object  
test1.bar()
print(test1.z)  # This will print 11

# Access the z attribute from the second Foo object
test2.bar()
print(test2.z)  # This will print 5

这是因为 __init__ 魔术方法中定义的变量在 Foo 对象第一次被调用时就被初始化了,所以这里定义的属性可以在之后立即访问。必须先调用 bar() 方法,然后才能访问 z 属性。我制作了 2 个 Foo 对象只是为了展示包含“自我”的重要性。在你的变量前面,因为每个属性都特定于那个特定的类实例。

我希望这能回答您的问题,但如果您提供一些示例代码来准确显示您想要做什么,这将非常有帮助。

【讨论】:

  • 谢谢,之前的评论也在同一行中提出了一些建议,这对我的目的有用。我只是想在导入特定类模块时访问它的变量,直到我在前缀为 self 的类下设置变量时才起作用。
【解决方案2】:

您可能应该使用类属性来存储此值。请注意,实现将取决于您的班级HelixTools 的实际用途。 但是对于示例,您可以使用以下内容:

import numpy as np

class HelixTools():

    def __init__(self):
        # Initialize the attribute so you'll never get an error calling it
        self.v1_v2_dot = None

    def calc_angle(self, v1, v2):       # Pass self as first argument to this method
        v1_mag = np.linalg.norm(v1)
        v2_mag = np.linalg.norm(v2)
        # Store the value in the attribute
        self.v1_v2_dot = np.dot(v1,v2)

然后:

from classes import HelixTools

ht = HelixTools()
v1 = some vector
v2 = some other vector
ht.calc_angle(v1,v2)    # This will not return anything
print(ht.v1_v2_dot)     # Access the calculated value

【讨论】:

  • 非常感谢。将变量定义为 self 类的一部分。变量完成了我所需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
相关资源
最近更新 更多