Ошибка AttributeError: объект 'tuple' не имеет атрибута
Я начинающий программист на Python, и у меня возникла проблема, которую я не могу понять.
У меня есть следующий код:
def list_benefits():
s1 = "Более организованный код"
s2 = "Более читаемый код"
s3 = "Упрощение повторного использования кода"
s4 = "Позволяет программистам делиться и соединять код"
return s1, s2, s3, s4
def build_sentence():
obj = list_benefits()
print(obj.s1 + " - это преимущество функций!")
print(obj.s2 + " - это преимущество функций!")
print(obj.s3 + " - это преимущество функций!")
print(build_sentence())
При выполнении я получаю следующую ошибку:
Traceback (most recent call last):
File "<stdin>", line 15, in <module>
File "<stdin>", line 11, in build_sentence
print(obj.s1 + " - это преимущество функций!")
AttributeError: 'tuple' object has no attribute 's1'
В чем может быть проблема? Как мне это исправить?
5 ответ(ов)
Возможно, мой ответ запоздалый, но, возможно, он будет полезен другим. Если вы всё же хотите обращаться к "атрибутам", то вы можете использовать класс с конструктором по умолчанию и создать экземпляр этого класса, как упомянуто в других ответах.
class ListBenefits(object):
def __init__(self):
self.s1 = "Более организованный код"
self.s2 = "Более читаемый код"
self.s3 = "Упрощенное повторное использование кода"
def build_sentence():
obj = ListBenefits()
print(obj.s1 + " - это преимущество функций!")
print(obj.s2 + " - это преимущество функций!")
print(obj.s3 + " - это преимущество функций!")
build_sentence()
Здесь класс ListBenefits
содержит три атрибута, каждая строка представляет собой отдельное преимущество использования функций. Функция build_sentence()
создает экземпляр класса и выводит на экран каждое из преимуществ.
Имена переменных имеют значение только в локальной области видимости.
Когда вы дошли до
return s1, s2, s3, s4
в конце метода, Python создает кортеж с значениями s1, s2, s3 и s4 в качестве его четырех элементов по индексам 0, 1, 2 и 3 — это НЕ словарь, связывающий имена переменных со значениями, и не объект с именами переменных и их значениями и т.д.
Если вы хотите, чтобы имена переменных имели смысл после выполнения return
в методе, вам нужно создать объект или словарь.
Я работаю с Flask и столкнулся с похожей проблемой. У меня была запятая после объявления переменных формы, когда я использовал WTForms. Именно это и стало причиной всей путаницы.
Вы возвращаете четыре значения из функции и сохраняете их в переменной obj. Это не значит, что obj является объектом. Поэтому вы не можете получить доступ к значениям как obj.s1, obj.s2 и т.д. Вместо этого используйте obj[index] для доступа к значениям.
print(obj[0])
Вы возвращаете четыре переменные s1
, s2
, s3
, s4
и получаете их, используя одну переменную obj
. Это называется кортеж
, и obj
ассоциирован с 4 значениями, которые соответствуют s1
, s2
, s3
и s4
. Чтобы получить нужное значение, используйте индексацию, как в списках, в порядке следования.
Вот пример:
obj = list_benefits()
print(obj[0] + " является преимуществом функций!")
print(obj[1] + " является преимуществом функций!")
print(obj[2] + " является преимуществом функций!")
print(obj[3] + " является преимуществом функций!")
Таким образом, вы можете обращаться к каждому значению по индексу, что позволяет удобно извлекать и использовать их в коде.
Получить описание исключения и стек вызовов, вызвавших исключение, в виде строки
Преобразование словаря в JSON
Как создать тестовые и обучающие выборки из одного DataFrame с помощью pandas?
TensorFlow Python: Доступ к отдельным элементам в тензоре
В Python есть функция для сокращения дробей?