ABCMeta funktioniert bei mir nicht

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
h1vltg3
User
Beiträge: 5
Registriert: Sonntag 7. Dezember 2008, 23:27

Hallo zusammen,

leider wird bei folgendem Programm, die fehlende Implementierung "zeichnen" in der Klasse Kreis mittels ABCMeta nicht erkannt ?
Kann sich das Problem evtl. einer von euch erklären ? Ich verwende Python 3.4

Code: Alles auswählen

import abc

class Figur(object):

    __metaclass__ = abc.ABCMeta
    
    @abc.abstractclassmethod
    def zeichnen(self): 
        NotImplementedError

class Kreis(Figur):
    
   
    def malen(self):
        print("malen")

if __name__ == '__main__':
    x = Kreis()
    x.malen()
    print('Subclass:', issubclass(Kreis, Figur))
    print('Instance:', isinstance(Kreis(), Figur))
Ausgabe:

malen
Subclass: True
Instance: True
Zuletzt geändert von Hyperion am Samstag 24. Mai 2014, 15:46, insgesamt 1-mal geändert.
Grund: Code in Python-Code-Tags gesetzt.
h1vltg3
User
Beiträge: 5
Registriert: Sonntag 7. Dezember 2008, 23:27

Ich hab das Problem gefunden, falls es jemanden interessiert :-) :

Code: Alles auswählen

class Figur(object):

    __metaclass__ = abc.ABCMeta  #Python 2
    
    @abc.abstractclassmethod
    def zeichnen(self): 
        NotImplementedError


class Figur(metaclass=abc.ABCMeta):  #Python 3

    #__metaclass__ = abc.ABCMeta
    
    @abc.abstractclassmethod
    def zeichnen(self): 
        NotImplementedError
Zuletzt geändert von Hyperion am Samstag 24. Mai 2014, 15:47, insgesamt 1-mal geändert.
Grund: Code in Python-Code-Tags gesetzt.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Ich denke nicht, dass abc.abstractclassmethod das ist, was du benutzen möchtest, eher abc.abstractmethod. Klassenmethoden sind Methoden die auf Klassen operieren und nicht auf Instanzen eben solcher. Dementsprechend verweist self in deinem Fall bei einer classmethod auf die Klasse und nicht auf die Instanz.

Dein Problem ist übrigens mal wieder ein hervorragendes Beispiel dafür, dass man semantische Änderungen bei dynamisch typisierten Programmiersprachen tunlichst vermeiden sollte (aka warum Python 3 nur so schleppend akzeptiert wird…).
Antworten