Facendo una funzione membro tratti due oggetti in modo diverso in Python

1

Nel mio programma ho una classe con una funzione membro che dovrebbe trattare alcuni oggetti in modo leggermente diverso dagli altri. Per fare questo, ha bisogno di sapere quale oggetto è stato passato ad esso, perché questi oggetti avrebbero dati peculiari indicati dai loro membri dei dati.

Ma sembra che fare riferimento al nome dell'oggetto invocante sia impraticabile e sconsigliato. Ho anche pensato di creare una nuova funzione per questi oggetti eccezionali, ma come farebbe a sapere che la funzione successiva in pila sa chiamarla?

Suppongo di poter creare un altro membro dei dati come una sorta di identificatore e testarlo durante l'esecuzione della mia funzione; ma sembra una soluzione abbastanza hacky. Qual è il modo più semplice per farlo?

    
posta Luca Del Signore 15.07.2016 - 01:07
fonte

1 risposta

5

Ci sono due modi per farlo:

Puoi usare isinstance per determinare quale sia la classe dell'oggetto:

if isinstance(foo, bar):
  do_something()
elif isinstance(foo, baz):
  do_something_else()
else:
  default_behavior()

Tuttavia, questo diventa ingombrante rapidamente con un gran numero di possibili classi e non è un buon OOP.

Il modo OOP sarebbe utilizzare il polimorfismo - definire una classe base con un metodo che restituisce i dati necessari e quindi creare sottoclassi:

class Polygon:
  def area(self):
    raise NotImplementedError

class Rectangle(Polygon):
  def area(self):
    return self.width * self.height

class Circle(Polygon):
  def area(self):
    return math.pi * self.radius**2

Quindi, nel tuo altro metodo:

area = obj.area() # you don't have to worry about what type the object is anymore!

Un terzo modo, probabilmente più pitonico, di fare questo è chiedere perdono, non il permesso:

try:
  foo = obj.bar
  do_something()
except AttributeError: # if obj doesn't have a bar attribute, then it must have a baz attribute
  foo = obj.baz
  do_something_else()

Tuttavia, se stai usando OOP, dovresti seguire il modo di fare OOP - lascia che il polimorfismo faccia tutto il lavoro.

    
risposta data 15.07.2016 - 01:30
fonte

Leggi altre domande sui tag