Seite 1 von 1

ABCMeta funktioniert bei mir nicht

Verfasst: Samstag 24. Mai 2014, 14:05
von h1vltg3
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

Re: ABCMeta funktioniert bei mir nicht

Verfasst: Samstag 24. Mai 2014, 14:27
von h1vltg3
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

Re: ABCMeta funktioniert bei mir nicht

Verfasst: Samstag 24. Mai 2014, 17:08
von Darii
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…).