Pasar de una clase base a una clase derivada es generalmente un signo de mal diseño en un programa. El método que propone, usando hasattr
, puede ser un problema grave. Te voy a mostrar:
# defined in some open source library
class MyObject(object):
def what_is_derived(self):
if hasattr(self, 'derived1'):
return 'derived1'
elif hasattr(self, 'derived2'):
return 'derived2'
else:
return 'base'
Vamos a suponer que las clases Derived1
Derived2
y se definen en la misma biblioteca. Ahora, desea utilizar las funciones de MyObject
, por lo que deriva de ella en su propio código.
# defined in your own code
class MyBetterObject(MyObject):
pass
better_object = MyBetterObject()
better_object.what_is_derived() # prints 'base'
El objetivo del polimorfismo es que puede tener muchas clases derivadas sin tener que cambiar la clase base. Al hacer que la clase base sea consciente de todas sus clases derivadas, se reduce drásticamente la utilidad de dicha clase. No puede crear una clase derivada sin cambiar la clase base.
Cualquiera que desee trabajar con una clase derivada, o que no les importa lo que la clase específica es y todo lo que necesita son las propiedades/métodos de la clase base. Es lo mismo en todos los lenguajes de programación orientada a objetos. Hay instalaciones para descubrir cuál es la clase derivada, pero generalmente es una mala idea.
Desde una perspectiva de modelos de Django, por lo general utilizar la herencia de tal manera:
class Address(models.Model):
# fields...
class Person(Address):
# fields...
class Business(Address):
# fields...
Address.objects.all() # find all addresses for whatever reason
Person.objects.all() # im only interested in people
Business.objects.all() # need to work with businesses
# need to show all addresses in a postcode, and what type of address they are?
businesses = Business.objects.filter(postcode='90210')
people = Person.objects.filter(postcode='90210')
# use the address properties on both
cadenas de herencia profundamente anidadas con modelos de Django son torpes. También son bastante innecesarios en la mayoría de los casos. En lugar de contaminar su clase base con las comprobaciones hasattr
, defina un método auxiliar que sea capaz de consultar las clases derivadas requeridas, si tal cosa es necesaria. Simplemente no lo defina en la clase Base.
Nah ... Mejor mira django-polymorphic ;-) – vdboor