Definiowanie artybutów w klasie

Witam,

mam następujący problem - myślę, że dość podstawowy; aczkolwiek szukałem rozwiązania i jak na razie "kiszka".

Mając następujący kod:

class JakasKlasa:
   pass

class InnaKlasa:
   atrybut_jakasKlasa = JakasKlasa   # linia budzaca kontrowersje

   def __init__(self, atrybut):
      self.atrybut_jakasKlasa = atrybut



pierwszy_obiekt = JakasKlasa()

obiektKlasy = InnaKlasa(pierwszy_obiekt) #tutaj odpalam debugger

W tej sytuacji odpalając debuggera mogę podglądnąć że tak na prawdę atrybut_jakasKlasa w obiekcie InnaKlasa ma jakby 2 wartości - jedną jest niezainicjalizowana instancja klasy JakasKlasa, a druga wartość to przypisany obiekt klasy JakasKlasa podany jako argument dla inita (w lini wywolania debuggera).

Moje pytanie brzmi - co właściwie robi Python w "lini budzącej kontrowersje"? To nie jest do typowanie (logiczne :P), ale koniecznie jest tam podanie "czegoś", bo inaczej jest zwracany błąd. Poza tym dlaczego tak "dziwna" wartość początkowa atrybutu nie jest po prostu zastępowana wartością z argumentu (co jest w istocie wykonywane w init )

Mam nadzieję, że wyraziłem się dostatecznie jasno. Dzięki.

2 lata temu | edytowane przez: Manveru 4224121

  • Po pierwsze, nie widzę tutaj nigdzie czegoś pt. "niezainicjalizowana instancja klasy".

    Po drugie, nie trzeba deklarować atrybutów, tzn. ten kod jest poprawny i nie zwraca żadnych błędów:

    class A(object):
    
        def __init__(self, v):
            self.value = v
    
    a = A(42)
    print a.value  # wypisze 42
    

    Jest też różnica pomiędzy atrybutami klasy i instancji:

    class A(object):
        x, y = 13, 19        
    
        def __init__(self, v):
            self.x = v
    
    print A.x, A.y  # atrybuty klasy = 13, 19
    a = A(42)
    print a.x  # atrybut instancji = 42 
    print a.y  # nie ma w instancji, więc odczytane z klasy = 19   
    a.y = 21  # przypisanie do instancji utworzy atrybut - nie zmieni atrybutu klasy
    print A.x, A.y  # nadal 13 i 19
    

    W końcu, twój kod z komentarzami:

    class JakasKlasa:
        pass
    # Została utworzona nowa klasa "JakasKlasa"
    # każda klasa jest obiektem
    
    class InnaKlasa:
        # początek klasy - wszystkie nazwy utworzone do końca
        # bloku będą atrybutami klasy
    
        atrybut_jakasKlasa = JakasKlasa   
        # to będzie atrybut klasy wskazujący na obiekt "JakasKlasa"
    
        # ta deklaracja funkcji będzie atrybutem klasy o nazwie "__init__"
        def __init__(self, atrybut):
            # self jest tutaj obiektem typu InnaKlasa
            # typ argumentu atrybut nie ma żadnego znaczenia
    
            self.atrybut_jakasKlasa = atrybut  
            # dodano do INSTANCJI self atrybut o nazwie "atrybut_jakasKlasa"
    
    pierwszy_obiekt = JakasKlasa() # tworzy instancję klasy JakasKlasa
    obiektKlasy = InnaKlasa(pierwszy_obiekt)  # tworzy instancję klasy InnaKlasa
    # obiektKlasy.atrybut_jakasKlasa == pierwszy_obiekt
    # InnaKlasa.atrybut_jakasKlasa == JakasKlasa
    # To nie są 2 różne wartości, tylko 2 różne atrybuty.
    

Zaloguj się, aby dodać swoją odpowiedź