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.

0
tsz napisał(a):

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

U mnie też działa, ale przy print(self.new_rema_data)
wyświetla się tylko pusta tablica:

[[], [], []]

Czyli, żadne wartości się nie zapisują, pytanie dlaczego tak się dzieje ?

0

@vpiotr: @tsz

Wyczyściłem kod z tych rzeczy których nie używam.
Tutaj aktualny pełny kod: https://paste.ofcode.org/5w6sGsHWxFthzHEcVrTG6E

Obecnie w kodzie mam 3 problemy których nie wiem jak rozwiązać:

  1. print(self.new_stored_data) - linijka 542 wypluwa tylko po jednej wartości w każdym wymiarze tablicy. A chce mieć wszystkie wartości w tablicy, aby móc je dalej wykorzystać.
  2. print(self.new_rema_data) - linijka 560 - identyczna sytuacja jak wyżej.
  3. W linijce 310 chce wywołać funkcje w której będę robił operacje na 3 tablicach (key_words, new_stored_data, new_rema_data) i wynik zapiszę w pliku excel. Jak to poprawnie zrobić ?
1

Sam fakt korzystania z klas to jeszcze nie programowanie obiektowe.

0

@TomRiddle: masz racje :)

1 oraz 2 problem są rozwiązane, został jeszcze problem numer 3.

0

Mam w class tablicę (new_rema_data).

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

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

Chciałbym ją użyć poza class. Np ją wyświetlić:

print(new_rema_data)

Jak to najlepiej zrobić ?
@stivens Chce to użyć w kodzie. Tą tablicę chce użyć w innej funkcji. Poza tą klasą.

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