Как я могу использовать значение переменной в методе внутри другого файла python?

#python #python-3.x

#python #python-3.x

Вопрос:

У меня есть переменная name внутри метода control_in(self) , который находится внутри класса Test .

Я попытался создать name атрибут, выполнив:

а) setattr(control_in, name ,»Harry Banes») б) control_in.name = «Гарри Бейнс»

В файле b.py Я пробовал использовать: a) from a import * b) import a c) from a import Test a.a) print(a.Test.control_in.name) a.b) print(t1.control_in.name) a.c) print(a.t1.control_in.name) a.d) global name в каждой части кода (я знаю, что это бесполезно, но просто хотел упомянуть, что я пробовал).

Я также пробовал return name и return control_in.name в конце метода control_in(self)

и none выводит значение переменной name. Но все, что я помещаю в метод init, он печатает. Возьмем print(t1.n) , к примеру, что печатает: numbers .

ДА, я уже искал и перепробовал множество решений, которые были у других StackOverflow Q amp; A, и ни одно из них не сработало, поэтому я спрашиваю лично.

a.py

 import b

class Test:
    def __init__(self):
        self.n = "numbers"

    def control_in(self):
        control_in.name = "Harry Banes"

if __name__ == '__main__':
    pass
  

b.py

 from a import *

if __name__ == '__main__':

    t1 = Test()

    print(t1.n) # Successfuly prints "numbers"
    print(t1.control_in.name) # Throws attribute error

  

Я ожидаю вывода «Harry Banes», но вместо этого я получаю эту ошибку: AttributeError: 'function' object has no attribute 'name'

Я хочу использовать значение из методов другого класса, отличных от init, в другом файле. Почему я этого хочу? Потому что это проблема, с которой я сталкиваюсь для кода большего размера, где мне нужна всего 1 переменная, чтобы что-то произошло в другой функции, из другого файла python, но я не знаю, как получить значение переменной.

Ответ №1:

Во-первых, control_in.name = "Harry Banes" это недопустимый код, потому что на метод класса нельзя ссылаться только по его имени, а по его классу:

 def control_in(self):
    Test.control_in.name = "Harry Banes"
  

или, что еще лучше, использовать self.__class__ для ссылки на класс:

 def control_in(self):
    self.__class__.control_in.name = "Harry Banes"
  

Во-вторых, Test.control_in.name он не будет определен до тех control_in пор, пока метод не будет вызван и выполнен, поэтому вы должны специально вызвать его:

 t1 = Test()
t1.control_in()
print(t1.control_in.name)
  

Это выводит:

 Harry Banes
  

Но, наконец, обычно нет веских причин добавлять атрибуты к объекту функции. В этом случае Test.control_in.name переменная привязана к методу класса и, следовательно, является общей для всех экземпляров и должна быть более идиоматически переопределена как переменная класса:

 class Test:
    name = "Harry Banes"
  

чтобы вы могли получить доступ name с помощью просто Test.name :

 print(Test.name)
  

Комментарии:

1. Большое вам спасибо за ваш образовательный и прямой ответ.