yılında str (öz. sınıf) kaydetmek emin böylece
class Base(models.Model):
[ we have some unique 'key' attribute ]
class_name = models.CharField(..., editable=False)
def get_base(self):
if self.__class__ == Base:
return self
# if we are not an instance of Base we 'go up'
return Base.objects.get(key=self.key)
def get_specific(self):
if self.__class__ != Base:
return self
# if we are an instance of Base we find the specific class
class_type = getattr(sys.modules["project.app.models"],
self.class_name)
return class_type.objects.get(key=self.key)
Genellikle bir işaretidir belirli sınıfları oluşturmak için bazı fabrika gerek Bir programda kötü tasarım. Önerdiğiniz yöntem, hasattr
kullanarak, ciddi bir sorun olabilir. Ben size göstereceğim:
# 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'
sınıfları Derived1
ve Derived2
aynı kitaplığında tanımlanan farz edelim. Şimdi, MyObject
'un özelliklerini kullanmak istiyorsunuz, böylece kendi kodunuzdan çıkarsınız.
# defined in your own code
class MyBetterObject(MyObject):
pass
better_object = MyBetterObject()
better_object.what_is_derived() # prints 'base'
Polimorfizmin bütün noktası, temel sınıf değişmek zorunda kalmadan birçok türetilmiş sınıfa sahip olmanızdır. Temel sınıfı, tüm türetilmiş sınıfların farkında olarak yaparak, böyle bir sınıfın yararlılığını ciddi ölçüde azaltırsınız. Temel sınıfı değiştirmeden türetilmiş bir sınıf oluşturamazsınız.
İster türetilmiş bir sınıfla çalışmak istersiniz, ya da belirli bir sınıfın ne olduğu ve ihtiyacınız olan şey temel sınıfın özellikleri/yöntemleridir. Tüm OOP dillerinde aynıdır. Türetilen sınıfın ne olduğunu bulmak için olanaklar vardır, ancak genellikle kötü bir fikirdir.Bir Django modelleri açısından bakıldığında
, ben genellikle bu şekilde devralma kullanın: Django modelleri ile
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
Derinden yuvalanmış miras zincirleri tuhaftır. Çoğu durumda da oldukça gereksizdirler. Temel sınıfınızı hasattr
kontrolleriyle kirletmek yerine, böyle bir şey istendiğinde gerekli türetilmiş sınıfları sorgulayabilen bir yardımcı yöntem tanımlayın. Sadece onu Base sınıfında tanımlamayın.
Hayır .. Django-polymorphic ;-) 'ye daha iyi bakın ;-) – vdboor