ndb.StructuredProperty ruft keine ndb.PolyModel-Unterklassenmethoden auf

Beim Speichern von ndb.Polymodel-Superklassen als ndb.StructuredProperty konnte ich nicht auf Unterklassenmethoden zugreifen. Stattdessen wurden Methoden der Oberklasse aufgerufen und NotImplementedError ausgelöst. Hier ist eine gekürzte Version dessen, was ich zu erreichen versuche.

class Recipient(polymodel.PolyModel):
  name = ndb.StringProperty()

  def PrettyPrinting(self):
    raise NotImplementedError, 'Rawr'


class ShippingRecipient(Recipient):
  address_line_one = ndb.StringProperty()
  #there are other properties, but they aren't necessary here.

  def PrettyPrinting(self):
    return 'Hey, this should be called.'


class LocalRecipient(Recipient):
  distribution_location = ndb.StringProperty()
  #same deal, more attributes, but useless for this example.

  def PrettyPrinting(self):
    return 'Hey this should be called.'

class Shipment(ndb.Model):
  recipient = ndb.StructuredProperty(Recipient)

Sagen Sie nun, dass ich eine Sendung gespeichert und einen Versandempfänger im Empfängerfeld der Sendung gespeichert habe. Im Datenspeicher ist die Sendungsempfängerklasse == ['Empfänger', 'Versandempfänger']. Wenn ich anrufe:

shipment = Shipment.get_by_id('some_key')
shipment.recipient.PrettyPrinting()

Der NotImplementedError wird anstelle der ShippingRecipient-Implementierung von PrettyPrinting (...) ausgelöst. Ich möchte, dass die Unterklassenmethode aufgerufen wird, wenn auf das Empfängerfeld der Sendung zugegriffen wird. Gibt es eine Möglichkeit, stattdessen zur Unterklassenmethode zu gelangen? Ich weiß, dass der Hinweis, dass die strukturierte Eigenschaft vom Typ Empfänger ist, dazu führt, dass die Superklasse aufgerufen wird, aber dann verstehe ich möglicherweise nicht vollständig, warum die Unterklasse im Attribut recipient.class gespeichert wird.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage