0

Ошибка AttributeError: объект 'tuple' не имеет атрибута

14

Я начинающий программист на 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 ответ(ов)

0

Возможно, мой ответ запоздалый, но, возможно, он будет полезен другим. Если вы всё же хотите обращаться к "атрибутам", то вы можете использовать класс с конструктором по умолчанию и создать экземпляр этого класса, как упомянуто в других ответах.

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() создает экземпляр класса и выводит на экран каждое из преимуществ.

0

Имена переменных имеют значение только в локальной области видимости.

Когда вы дошли до

return s1, s2, s3, s4

в конце метода, Python создает кортеж с значениями s1, s2, s3 и s4 в качестве его четырех элементов по индексам 0, 1, 2 и 3 — это НЕ словарь, связывающий имена переменных со значениями, и не объект с именами переменных и их значениями и т.д.

Если вы хотите, чтобы имена переменных имели смысл после выполнения return в методе, вам нужно создать объект или словарь.

0

Я работаю с Flask и столкнулся с похожей проблемой. У меня была запятая после объявления переменных формы, когда я использовал WTForms. Именно это и стало причиной всей путаницы.

0

Вы возвращаете четыре значения из функции и сохраняете их в переменной obj. Это не значит, что obj является объектом. Поэтому вы не можете получить доступ к значениям как obj.s1, obj.s2 и т.д. Вместо этого используйте obj[index] для доступа к значениям.

print(obj[0])
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] + " является преимуществом функций!")

Таким образом, вы можете обращаться к каждому значению по индексу, что позволяет удобно извлекать и использовать их в коде.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь