Dlaczego nie mogę usunąć atrybutu z klasy?

0

Z tego, co rozumiem z dokumentacji, https://docs.python.org/3/reference/simple_stmts.html#del , to podobnie jak mogę ustawiać rozmaite zmienne przypisując im wartość, tak samo mogę je usuwać za pomocą keyworda del, czy tak?

Jak więc rozumiem, ten kod powinien działać?

class Klasa:
    atrybut = []
 
    def __init__(self):
        del self.atrybut
     
obiekt = Klasa()  

Skutkiem wykonania konstruktora powinno być, że obiekt klasy powinien zostać pozbawiony atrybutu atrybut?

Jednak ten kod rzuca wyjątkami:

Traceback (most recent call last):
  File "./prog.py", line 7, in <module>
  File "./prog.py", line 5, in __init__
AttributeError: atrybut

http://ideone.com/6BEOrW

Czego nie rozumiem?

0

Wiesz że to jest atrybut klasy? Jeśli chcesz go usunąć, powinieneś się do niego odwołać z przestrzenią nazw klasy a nie obiektu.

https://ideone.com/nP6EB3

0

Aaale to go usunie dla wszystkich obiektów tej klasy?

Nie można usunąć go tylko dla konkretnego obiektu?

0

Możesz np. zrobić oddzielną funkcję która to zrobi.

0

Python ma przestrzeń nazewniczą dla atrybutów klasy i obiektu. Dla klasy już zrobiłeś. Dla obiektu to będzie w przestrzeni nazewniczej self.
https://www.toptal.com/python/python-class-attributes-an-overly-thorough-guide

0

Ale atrybut KLASY nie należy do OBIEKTU tylko jest WSPÓLNY!

0
class Klasa:
    atrybut = []
 
    def delete(self):
        del self.atrybut
 
obiekt = Klasa()
obiekt.atrybut = []
obiekt.delete()


obiekt = Klasa()
obiekt.delete()
>>> AttributeError: atrybut

Dzieje się tak dlatego, że atrybut jest w przestrzeni nazw klasy a nie obiektu. Jak ustawisz nową wartość już dla przestrzeni obiektu to dopiero będziesz mógł go skasować z przestrzeni nazw obiektu.

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