2016-05-10 29 views
2

Ich versuche, ein objektorientiertes Programm zu schreiben, das es mir ermöglicht, monatliche Einnahmen und Rechnungen einzugeben und zu speichern und alle Daten nach Bedarf anzuzeigen. Ich kann ein Objekt erfolgreich speichern, aber wenn ich versuche, meine view_all Funktion zu nutzen, bekomme ich diesen Fehler:AttributeError: 'str' Objekt hat kein Attribut (Funktion)

in view_all print (item.get_month()) Attribute: ‚str‘ Objekt hat kein Attribut ‚get_month‘

Wenn Sie mir helfen könnten, dieses Problem aufzuspüren, 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()   
+0

FYI: Getter und Setter in Python zu verwenden ist höchst ungewöhnlich. – Matthias

+0

@Matthias Dies war Teil unseres Lehrbuchs. Wird es wirklich nicht oft benutzt? –

+0

Nein, ist es nicht. Welchen Vorteil haben Sie in Python, wenn Sie Getter und Setter verwenden? Verwenden Sie einfach das Instanzattribut selbst. Wenn es etwas mehr Logik gibt, als nur den Wert zu setzen, wird die Verwendung des Dekorators '@ property' empfohlen. Check out [diese Frage] (http://stackoverflow.com/questions/2627002/whats-the-pythonic-way-to-use-getters-and-setters). – Matthias

Antwort

2

Sie müssen über das Wörterbuch iterieren anders

for month, item in months.items(): 
    print(item.get_month()) 
    ... 
+0

Super. Das hat mich eine Weile gestört, danke für deine Hilfe. –

+0

ein anderes kleines Problem wird angezeigt, nachdem die .dat-Datei erstellt wurde. UnboundLocalError: lokale Variable 'month_dct', auf die vor der Zuweisung verwiesen wird. Es scheint ein Problem beim Laden der Daten aus der .dat-Datei in das monates_dct-Wörterbuch zu bestehen, speziell in der Zeile "return month_dct". –

+0

Nevermind, fand den Fehler. –

0

Im view_all Methode, müssen Sie Wörterbuch iterieren:

und Sie haben andere Fehler in __str__ Methode Monats Klasse:

"\nPNM: " + self.__PNM + \ 

die richtige ist:

"\nPNM: " + self.__pnm + \ 
Verwandte Themen