AttributeError: 'str' - Objekt hat kein Attribut (Funktion)

Bin ich zu schreiben versucht, ein Objekt-orientiertes Programm, dass mir erlaubt, einzugeben und zu speichern monatliches Einkommen und Rechnungen, und alle Daten wie gewünscht. Ich kann erfolgreich speichern Sie ein Objekt, aber wenn ich versuche, mit meinem view_all-Funktion, bekomme ich diesen Fehler:

in view_all print(item.get_month())
AttributeError: 'str' - Objekt hat kein Attribut 'get_month'

Wenn Ihr mir helfen könntet, die Spur dieses problem wäre ich dankbar!

# Create a month class

class Month:

    # Use __init__ method to initialize the attributes

    def __init__(self, month, income, tds, pnm, zia, water):
        self.__month = month
        self.__income = income
        self.__tds = tds
        self.__pnm = pnm
        self.__zia = zia
        self.__water = water


    # The set methods accept arguments:

    def set_month(self, month):
        self.__month = month

    def set_income(self, income):
        self.__income = income

    def set_tds(self, tds):
        self.__tds = tds

    def set_pnm(self, pnm):
        self.__pnm = pnm

    def set_zia(self, zia):
        self.__zia = zia

    def set_water(self, water):
        self.__water = water

    # The get methods return the data:

    def get_month(self):
        return self.__month

    def get_income(self):
        return self.__income

    def get_tds(self):
        return self.__tds

    def get_pnm(self):
        return self.__pnm

    def get_zia(self):
        return self.__zia

    def get_water(self):
        return self.__water

    # The __str__ method return's the object's state as a string

    def __str__(self):
        return "Month: " + self.__month + \
               "\nIncome: " + self.__income + \
               "\nTDS: " + self.__tds + \
               "\nPNM: " + self.__PNM + \
               "\nZia: " + self.__zia + \
               "\nWater: " + self.__water

Und das Hauptprogramm:

import Month_Class
import pickle

ADD_MONTH = 1
VIEW_ALL = 2
QUIT = 3

FILENAME = 'ruidoso.dat'

def main():
    months = load_months()
    choice = 0
    while choice != QUIT:
        choice = get_menu_choice()

        if choice == ADD_MONTH:
            add_month(months)
        elif choice == VIEW_ALL:
            view_all(months)

    save_months(months)


def load_months():
    try:
        input_file = open(FILENAME, 'rb')
        months_dct = pickle.load(input_file)
        input_file.close
    except IOError:
        month_dct = {}
    return month_dct

def get_menu_choice():
    print()
    print('Menu')
    print('------------------')
    print("1. Add data for a new month")
    print("2. View data for all months")
    print('Any other number saves and quits the program!')
    print()

    choice = int(input('Enter your choice: '))
    while choice < ADD_MONTH or choice > QUIT:
             choice = int(input('Enter a valid choice: '))
    return choice

def add_month(months):
    month = input('Enter the name of the month: ')
    income = input('Total income for this month: ')
    tds = input('TDS Broadband bill total: ')
    pnm = input('PNM bill total: ')
    zia = input('Zia Natural Gas bill total: ')
    water = input('City of Ruidoso bill total: ')

    entry = Month_Class.Month(month, income, tds, pnm, zia, water)

    if month not in months:
        months[month] = entry
        print('The entry has been added')
    else:
        print('That month already exists!')

def save_months(months):
    output_file = open(FILENAME, 'wb')
    pickle.dump(months, output_file)
    output_file.close()


def view_all(months):
    for item in months:
        print(item.get_month())
        print(item.get_income())
        print(item.get_tds())
        print(item.get_pnm())
        print(item.get_zia())
        print(item.get_water())

main()        
  • FYI: die Verwendung von Getter und setter in Python ist sehr ungewöhnlich.
  • Dies war Teil von unserem lehrbuch. Ist es wirklich nicht oft benutzt?
  • Nein, es ist nicht. Welchen Vorteil bekommt man in Python wenn Sie Getter und setter? Verwenden Sie einfach die Instanz-Attribut selbst. Wenn es etwas mehr Logik als nur die Einstellung für den Wert der Nutzung der @property Dekorators wird empfohlen. Check out diese Frage.
InformationsquelleAutor Python guy | 2016-05-10
Schreibe einen Kommentar