Ho una super classe con un metodo che chiama altri metodi che sono definiti solo nelle sue sottoclassi. Ecco perché, quando creo un'istanza della mia super classe e chiamo il suo metodo, non riesce a trovare il metodo e genera un errore.Prevenzione di una classe dall'istanza diretta in Python
Ecco un esempio:
class SuperClass(object):
def method_one(self):
value = self.subclass_method()
print value
class SubClassOne(SuperClass):
def subclass_method(self):
return 'subclass 1'
class SubClassTwo(SuperClass):
def subclass_method(self):
return 'nubclass 2'
s1 = SubClassOne()
s1.method_one()
s2 = SubClassTwo()
s2.method_one()
c = SuperClass()
c.method_one()
# Results:
# subclass 1
# nubclass 2
# Traceback (most recent call last):
# File "abst.py", line 28, in <module>
# c.method_one()
# File "abst.py", line 4, in method_one
# value = self.subclass_method()
# AttributeError: 'SuperClass' object has no attribute 'subclass_method'
stavo pensando di cambiare il init di classe super e verificare il tipo di oggetto, quando viene creata una nuova istanza. Se l'oggetto appartiene alla super classe, genera un errore. Tuttavia, non sono sicuro se sia il modo Pythoniano di farlo.
Qualche consiglio?
Il modo Pythonic è di scrivere una buona documentazione che spiega come deve essere utilizzata la classe. – yak
@chown: in realtà viene eseguito abbastanza frequentemente in C++. Quello che sta facendo è essenzialmente chiamare metodi virtuali. Non c'è nulla di intrinsecamente sbagliato in loro, se sono la soluzione adeguata al problema. – rossipedia
Concordo sul fatto che non è molto Pythonic – rossipedia