Mam specyficzny problem python. Podczas wykonywania mojej aplikacji python gtk niektóre z moich obiektów klasy w tajemniczy sposób tracą atrybuty, powodując przerwanie niektórych funkcji mojego programu.Python classes tracące atrybuty
Trudno jest wyjaśnić, dlaczego tak się stało - nigdy celowo nie usuwam atrybutów, a klasy, o których mowa, dziedziczą po klasie, którą sam napisałem (i żadnych innych).
mogę wywołać problem wykonując pewne czynności wielokrotnie (na przykład generując wiele wywołań metody add_card
- albo klikając szalenie lub otwierając plik, powodując add_card
na miano około dwudziestu razy)
Naprawdę nie mogę się doczekać, i żałuję, że nie mam więcej informacji, które uznałem za przydatne.
Co może spowodować utratę atrybutów przez obiekt Pythona?
EDYCJA, Re. Pytania:
Oto przykładowe tracebacks związane z dwóch atrybutów I 'stracić':
Traceback (most recent call last):
File "lib/genericlist.py", line 90, in cursor_changed
if self.viewer:
AttributeError: 'DeckerRunnerList' object has no attribute 'viewer'
Traceback (most recent call last):
File "lib/genericlist.py", line 100, in row_activated
selection = self.TABLE_NAME+"&&"+text
AttributeError: 'DeckerRunnerList' object has no attribute 'TABLE_NAME'
I tu, gdzie są ustawione:
class DeckerGenericList(object):
def __init__(self, database, viewer=None, deck=None):
super(DeckerGenericList, self).__init__()
self.database = database
self.viewer = viewer
self.deck = deck
#TABLE_NAME is set in the subclass constructor
Ta szczególna podklasa doesen't nazywają to nadklasa __init__
, więc zestawy atrybutów są duplikowane w podklasie:
class DeckerRunnerList(DeckerGenericList):
def __init__(self, database, viewer=None, deck=None):
self.database = database
self.viewer = viewer
self.deck = deck
self.TABLE_NAME = "runners"
Wszystkie inne podklasy DeckerGenericList mają ten sam problem, a wszystkie one są zdefiniowane następująco:
class DeckerGearList(DeckerGenericList):
def __init__(self, database, viewer=None, deck=None):
self.TABLE_NAME = "gear"
#... some other class attributes
super(DeckerGearList, self).__init__(database, viewer=viewer, deck=deck)
Czy używasz wątków? Czy możesz pokazać kod? – Keith
Jak i * kiedy * ustawiasz te atrybuty? Skąd wiesz, że zostały one usunięte? – Kos
Po pierwsze, jeśli jeszcze tego nie zrobiłeś, sprawdź typ obiektu, aby upewnić się, że jest to instancja twojej klasy. Uważam, że śledzenie typów w słabo dynamicznie wpisywanych językach, takich jak Python, jest częstym źródłem błędów. . – ApproachingDarknessFish