2017-10-13 10 views
0

En utilisant abc, je peux créer des classes abstraites en utilisant les éléments suivants:Comment créer des classes abstraites en utilisant abc sans utiliser une méthode abstraite?

from abc import ABC, abstractmethod 
class A(ABC): 
    @abstractmethod 
    def foo(self): 
     print('foo') 
class B(A): 
    pass 

obj = B() 

Cela échouera parce que B n'a pas défini la méthode foo. Ceci imite la fonctionnalité de méthode abstraite dans Java.

Je voulais savoir si la fonctionnalité de classe abstraite est également présente dans Python, où l'instanciation d'une classe est empêchée sans avoir de méthodes abstraites.

+0

Je ne comprends pas votre question. Que voulez-vous dire par «où l'instanciation d'une classe est empêchée sans avoir de méthodes abstraites»? vous voulez imposer la classe elle-même pour implémenter des méthodes abstraites? – Vinny

+0

En Java, la méthode abstraite et les classes abstraites sont deux concepts différents. Les méthodes abstraites doivent être définies par les sous-classes et les classes abstraites ne peuvent pas être instanciées. Mais dans le module abc de python (à ma compréhension) les deux sont liés ensemble. Existe-t-il un moyen de définir une classe abstraite sans décorer les méthodes en tant que méthodes abstraites? –

Répondre

0

Une façon simple d'éviter initalizing une classe abstraite est:

class Abs(object): 
    def __init__(self, *args, **kwargs): 
     raise NotImplementedError('abstract class can not be initalized') 

    def some_func(self): 
     raise NotImplementedError 

Cela déclenche une exception avec un message informatif et ne laissera pas votre classe soit initalized. Le sous-classement est nécessaire pour créer une instance de cet objet.

La méthode est un résumé aussi:

[...] Dans les classes de base définies par l'utilisateur, méthodes abstraites devraient soulever cette exception quand ils ont besoin classes dérivées à remplacer la méthode, ou pendant le développement de la classe pour indiquer que l'implémentation réelle doit encore être ajoutée.

C'est une autre façon de déclarer une méthode comme abstraite. La différence est @abstractmethod relèvera TypeError: Can't instantiate abstract class B with abstract methods foo si la classe B n'a pas outrepassé la méthode foo, tandis que raise NotImplementedError échouera uniquement lors de l'exécution, et non lors de la création de l'objet instance.

0

La manière classique de créer une classe abstraite en Python consiste à élever l'exception intégrée NotImplementedError.

class A(object): 
    def __init__(self): 
     raise NotImplementedError('abstract base class') 

class B(A): 
    def __init__(self): 
     # don't call A.__init__ here. 
     pass 

b = B() 
# a = A() # This will fail.