如何从另一个文件中的类模块导入python中的全局变量?

时间:2018-11-05 20:34:08

标签: python class variables import

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

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才能将其用作另一个函数的输入。

2 个答案:

答案 0 :(得分:0)

这是如何访问类属性的示例(如果我了解您要正确执行的操作)。假设您有一个名为“ 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__ magic方法中定义的变量是在首次调用Foo对象时立即初始化的,因此可以在此之后立即访问此处定义的属性。必须先调用bar()方法,然后才能访问z属性。我制作了2个Foo对象,只是为了说明包括“自我”的重要性。在变量前面,因为每个属性都是特定于该特定类实例的。

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

答案 1 :(得分:0)

您可能应该使用class属性存储此值。注意,实现将取决于您的类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