• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Komunikacja miedzy klasami - python

Object Storage Arubacloud
0 głosów
1,289 wizyt
pytanie zadane 6 sierpnia 2019 w Python przez Dominoday Początkujący (420 p.)
zamknięte 7 sierpnia 2019 przez Dominoday

Witam,

W jaki sposób mogę przekazać dane ze zmiennej która jest w funkcji "b" w klasie A do klasy B w której jest funkcja główna a w niej funkcja "c"?

class A():
     def b():
       zmienna  = 4
 
class B():
    def main():
        def c():
             #i tu potrzebuje "zmienna"
             print(zmienna)

 

komentarz zamknięcia: uzyskanie odpowiedzi
komentarz 6 sierpnia 2019 przez RafalS VIP (122,820 p.)

@Dominoday wrzuć prawdziwy kod, bo strasznie dziwnie to wszystko wygląda. Prawdopodobnie da się obejść problem, ale musze widzieć prawdziwy kod

komentarz 6 sierpnia 2019 przez Dominoday Początkujący (420 p.)

Jest to mój pierwszy taki większy projekt w pythonie więc proszę o wyrozumiałość jak chodzi o mój kod bo zapewne połowę z tego można było zrobić krócej i prościej ale dopiero się uczę :) 

https://github.com/Dominoday2017/SEH-/tree/master

komentarz 6 sierpnia 2019 przez RafalS VIP (122,820 p.)
Edytowałem odpowiedz, rzuć okiem.

2 odpowiedzi

+1 głos
odpowiedź 6 sierpnia 2019 przez RafalS VIP (122,820 p.)
wybrane 6 sierpnia 2019 przez Dominoday
 
Najlepsza

Zacznijmy od tego, że dziwnie definiujesz metody klasy. Metoda powinna przyjmować jeden argument, przeważnie nazywany self, który jest referencją do obiektu na którym wywołana została metoda. U Ciebie metody są statyczne, ale bez dekoratora @staticmethod przez co nie możesz ich wywołać na obiekcie:

a = A()
A.b() # <- działa
a.b() # <- error

Jeśli faktycznie wiesz co robisz i miałeś na myśli metody statyczne to jest kilka opcji:

  1. brzydka - zmienna globalna:
    zmienna = None
    class A:
        @staticmethod
        def b():
            global zmienna
            zmienna = 4
    
    class B:
        @staticmethod
        def main():
            def c():
                # i tu potrzebuje "zmienna"
                global zmienna
                print(zmienna)
                zmienna = 10
    
            c()
    
    A.b()
    B.main()
  2. jeśli jest taka możliwość to zwrócić zmienna z metody b:
    class A:
        @staticmethod
        def b():
            zmienna = 4
            return zmienna
    
    class B:
        @staticmethod
        def main():
            def c():
                # i tu potrzebuje "zmienna"
                zmienna = A.b()
                print(zmienna)
    
            c()
    
    A.b()
    B.main()
    

EDIT po zobaczeniu kodu:

        def takedata_and_close():
            self.name = self.name_edit.text()

i do name dobierasz się przez obiekt add_data:

a = add_data()
print(a.name)

zakładając że gdzieś ten obiekt stworzysz i będziesz miał do niego dostęp w klasie Main_window

komentarz 6 sierpnia 2019 przez Dominoday Początkujący (420 p.)
No tak tylko jak to zrobić, żeby add_data() uruchamiało się tylko po wciśnięciu przycisku? Jak dam a = add_data() przed add_data_function() to uruchamia się od razu a tego właśnie nie chce.
komentarz 6 sierpnia 2019 przez RafalS VIP (122,820 p.)

żeby add_data() uruchamiało się tylko po wciśnięciu przycisku

ja już nic nie ogarniam, nie mam pojęcia jak to działa...

kto tworzy

self.add_btn

?

I czemu add_data to klasa? Co ona ma robic?

komentarz 6 sierpnia 2019 przez Dominoday Początkujący (420 p.)
add_btn to jest nazwa przycisku który wcześniej stworzyłem w Qt Designer. Klasa add_data jest po to aby właśnie móc otworzyć nowe okienko które ma na celu pobranie danych od użytkownika. Próbowałem już zrobić wszystko w jednej klasie ale wtedy UI się na siebie nakładają i jest jedna wielka tragedia.
komentarz 6 sierpnia 2019 przez RafalS VIP (122,820 p.)
Problem masz z synchronizacją. Tworzysz a = add_button() i od razu byś chciał czytać a.name, które jeszcze nie jest ustawione. Nie wiem jak to rozwiązać, za bardzo to zagmatwałeś i nie znam pyqt
komentarz 6 sierpnia 2019 przez Dominoday Początkujący (420 p.)
Dobra ale i tak dzięki za pomoc bo teraz przynajmniej już wiem jak przekazać dane między klasami.
+1 głos
odpowiedź 6 sierpnia 2019 przez Paweł Nąckiewicz Nałogowiec (48,990 p.)
class A:
     def b():
       zmienna = "hi"
       return zmienna
  
class B:
    def main():
        def c():
            obiekt = A()
            #i tu potrzebuje "zmienna"
            print(obiekt.b)

Zobacz cos takiego. Nie mam przy sobie kompilatora wiec jak cos pokaz ewentualne kody bledu. 

komentarz 6 sierpnia 2019 przez Dominoday Początkujący (420 p.)
W ten sposób już próbowałem i kompilator nie "potrafi" się dostać do funkcji b() i wypisuje błąd: 'A' object has no attribute 'b'. (podstawiłem to pod swój program)
komentarz 6 sierpnia 2019 przez Dominoday Początkujący (420 p.)
Nie mogę również zrobić tak: x = b() gdyż funkcję b() wywołuję poprzez przycisk: przycisk.clicked.connect(b)
komentarz 6 sierpnia 2019 przez Paweł Nąckiewicz Nałogowiec (48,990 p.)
Nie wiem czy zauważyłeś ale ja mam inaczej zadeklarowana klasa A, dlatego możliwe, że miałeś bład że nie można dostać się do funkcji b()
komentarz 6 sierpnia 2019 przez Dominoday Początkujący (420 p.)

Tylko widzisz u mnie deklaracja klasy A wygląda tak: 

class A(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

 

komentarz 6 sierpnia 2019 przez Paweł Nąckiewicz Nałogowiec (48,990 p.)
Jest ten kod gdzies na gicie? Jak wroce do domu to zerkne
1
komentarz 6 sierpnia 2019 przez RafalS VIP (122,820 p.)

print(obiekt.b)

prawdopodobnie nie miałeś na myśli wyświetlenia referencji do metody tylko jej wywołanie, które nie zadziała bo nie ma @staticmethod lub parametru self

komentarz 6 sierpnia 2019 przez Paweł Nąckiewicz Nałogowiec (48,990 p.)
racja :)

Podobne pytania

0 głosów
1 odpowiedź 248 wizyt
pytanie zadane 23 marca 2021 w Python przez user125 Początkujący (400 p.)
0 głosów
4 odpowiedzi 624 wizyt
pytanie zadane 5 września 2015 w C i C++ przez 0xf Dyskutant (8,180 p.)
0 głosów
0 odpowiedzi 284 wizyt

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...