#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. Большое вам спасибо за ваш образовательный и прямой ответ.