Как импортировать глобальные переменные в Python из модуля класса в другом файле? - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть файл, который содержит определения классов и функции, которые мне нужно использовать в моем главном файле, чтобы сделать текст чище. Однако у меня проблема с импортированными глобальными переменными.

В 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 голосов
/ 06 ноября 2018

Вероятно, вам следует использовать атрибут класса для хранения этого значения. Обратите внимание, что реализация будет зависеть от того, что действительно делает ваш класс 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
0 голосов
/ 06 ноября 2018

Вот пример того, как вы можете получить доступ к атрибутам класса (если я понимаю, что вы хотите сделать правильно). Предположим, у вас есть файл Python с именем «Test_class.py», который содержит следующий код:

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, чтобы показать важность включения «я». перед вашими переменными в том смысле, что каждый атрибут специфичен для данного конкретного экземпляра класса.

Я надеюсь, что это ответит на ваш вопрос, но было бы очень полезно, если бы вы предоставили пример кода, чтобы точно показать, что именно вы хотите сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...