Początki programowania obiektowego

0

Witam,
są to moje pierwsze początki jeśli chodzi o programowanie obiektowe. Proszę o informacje czy poprawnie to robię.
Generalnie to chce z dwóch pętli zapisać dane, aby je wykorzystać później w innej funkcji:

class Alarm():

    def alarm_variable(parsed_file, file):
	
		excel_path = file.split("/")
        excel_path = "/".join(excel_path[:-1])
        print(excel_path)

        # Parsing xml file

        driver_name = parsed_file.xpath("")
        driver_module = parsed_file.xpath("")
        driver_id = parsed_file.xpath("")
        variables_driver_id = parsed_file.xpath("")
        limit_value_text = parsed_file.xpath("")
        symbolic_address = parsed_file.xpath("")
        name = parsed_file.xpath("")
        reaction_matrix_active = parsed_file.xpath("")
        reaction_matrix_name = parsed_file.xpath("")
			
	    for i in range(len(limit_value_text)):
        xml_data = XMLData
        xml_data.add_xml_data(limit_value_text[i].text, name[i].text, symbolic_address[i].text, variables_driver_id[i])
		if variables_driver_id[i] in driver_id:
            for g in range(len(driver_id)):
                if variables_driver_id[i] == driver_id[g]:
                    xml_data.add_xml_data(driver_name[g].text, driver_module[g].text)
                    break

				if limit_value_text[i].text[1:] in key_words[0]:
					for j in range(len(key_words[0])):
						if limit_value_text[i].text[1:] == key_words[0][j]:
							xml_data.add_xml_data(key_words[1][j])
							break
				else:
					xml_data.add_xml_data("")  # add empty string if translated text not available
   def alarm_rema(self, parsed_file, file):

        xml_rema = XMLREMA

        matrix_name = parsed_file.xpath("")

        for s in range(len(matrix_name)):
            matrix_limit_value = parsed_file.xpath("")
            rea_alarm = parsed_file.xpath("")
            if len(key_words[0]) > 0:
                for s in range(len(matrix_limit_value)):
                    try:
                        if matrix_limit_value[s].text[1:] in key_words[0]:  # TODO convert to dict
                            for j in range(len(key_words[0])):
                                if matrix_limit_value[s].text[1:] == key_words[0][j]:
                                    xml_rema.add_rema_data(matrix_limit_value[s].text, key_words[1][j], rea_alarm[s].text)
                        else:
                            xml_rema.add_rema_data(matrix_limit_value[s].text, None, rea_alarm[s].text)
                    except:
                        continue

class XMLData:
    def __init__(self, new_limit_value_text, new_name, new_symbolic_address, new_variable_driver_id, new_driver_name, new_driver_module):
        self.stored_data = [], []
        self.new_limit_value_text = new_limit_value_text
        self.new_name = new_name
        self.new_symbolic_address = new_symbolic_address
        self.new_variables_driver_id = new_variable_driver_id
        self.new_driver_name = new_driver_name
        self.new_driver_module = new_driver_module

    def add_xml_data(self, limit_value_text, new_name, new_symbolic_address, new_variable_driver_id, new_driver_name, new_driver_module):
        self.stored_data.append(new_limit_value_text, new_name)


class XMLREMA:
    def __init__(self, new_matrix_values, new_key_words, new_rea_alarm):
        self.new_rema_data = [], [], []
        self.new_matrix_values = new_matrix_values
        self.new_key_words = new_key_words
        self.new_rea_alarm = new_rea_alarm

    def add_rema_data(self, new_matrix_values, new_key_words, new_rea_alarm):
        self.new_rema_data.append(new_matrix_values, new_key_words, new_rea_alarm)

PS. I swoją drogą dostaję taki błąd:

    self.stored_data.append(limit_value_text)
AttributeError: 'str' object has no attribute 'stored_data'

Proszę o informacje czy program jest dobrze napisany, i jeśli nie to co poprawić ?

1

Pierwsza nazwa metody alarm_variable jest do poprawki.
Nazwa metody powinna zaczynać się od czasownika.

Zobacz:
http://courses.necaise.org/PythonStyleGuide/NamingConventions

i:

0

@vpiotr: Dzięki.
Kilka rzeczy poprawiłem aby lepiej kod się czytało.
A możesz mi powiedzieć czy ten kod ma prawo zapisać dane w tablicy (lub słowniku) ?
Bo nie mogę odczytać niczego z tablic.

2
Caporeira napisał(a):

@vpiotr: Dzięki.
Kilka rzeczy poprawiłem aby lepiej kod się czytało.
A możesz mi powiedzieć czy ten kod ma prawo zapisać dane w tablicy (lub słowniku) ?
Bo nie mogę odczytać niczego z tablic.

Potestuj na prostszych przykładach.
Zrób sobie hello world z jedną linijką zapisującą dane i jedną linijką odczytującą z wybranej struktury. A potem to wyświetl.

0

@vpiotr: Czytam, próbuje i ciągle nie mogę tego do mojego przykładu zastosować :(
Czyli tą tablicę muszę mieć poza tymi klasami ? Bo jak tworzę ją w klasie, to chyba ulega ona skasowaniu.
Czy mógłbyś mi dać jakąś namiastkę przykładu ?

0

Przykro mi, a Masz jakieś unit testy?

0

Może mógłby rzucić okiem na mój kod:
https://paste.ofcode.org/Qbq3F5dSnHC97wWVLkNRif

Oraz powiedzieć gdzie robię błąd oraz co mógłbym poprawić ?

@Pipes Sam się uczę, piszę tylko czasami oraz dla własnych potrzeb. Dlatego, wiem że nie będę profesjonalistą. Ale myślałem że z pomocą forum, uda mi się chociaż trochę podnieś umiejętność i nauczyć czegoś nowego :)

1

Eeeee, ale jemu to chyba bardziej chodzi o ten błąd. A nawet jeśli to refaktorowanie niedziałającego kodu jest kiepskim pomysłem.

    self.stored_data.append(limit_value_text)
AttributeError: 'str' object has no attribute 'stored_data'

Wychodzi, że za selfa jakimś cudem podstawiłeś stringa, co jest niezłym wyczynem. Do tego liczba argumentów nie pasuje w żadnym z wywołań, ale patrząc choćby na nazwy zmiennej to jest trochę starsza wersja kodu. Wygląda na to, że wywołujesz metody na obiekcie tak jak powinno, ale patrząc wyżej:

xml_data = XMLData

Zamiast stworzyć sobie instancję klasy to ją po prostu zapisujesz do zmiennej. Więc w późniejszym kodzie nie wywołujesz metod na obiekcie, ale na klasie. A metody na klasie nie są zbindowane, więc nie podstawiają nic pod selfa.

xml_data = XMLData()

I powinno coś działać.

0

@tsz: Dzięki, zrobiłem to tak:

                                    xml_rema = XMLREMA(matrix_limit_value[s].text, key_words[1][j], rea_alarm[s].text)
                                    xml_rema.add_rema_data()

class XMLREMA:

    def __init__(self, new_matrix_values, new_key_words, new_rea_alarm):
        self.new_rema_data = [[], [], []]
        self.new_matrix_values = new_matrix_values
        self.new_key_words = new_key_words
        self.new_rea_alarm = new_rea_alarm

    def add_rema_data(self):
        print(self.new_rema_data)
        self.new_rema_data[0].append(self.new_matrix_values)
        self.new_rema_data[1].append(self.new_key_words)
        self.new_rema_data[2].append(self.new_rea_alarm)
        return self.new_matrix_values, self.new_rema_data

ale tablica self.new_rema_data jest pusta.
Jak to zrobić aby zapisać te wartości w tablicy lub słowniku, aby te dane było można wykorzystać w innej klasie (odpowiedzialnej za zapis pliku excel) ?

0

Nie wiem, wkleiłem ten kod u siebie i działa normalnie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1