ich folgenden Schnipsel habe:Hinzufügen Dynamically Klassenmethoden zu einer Klasse
FEED_TYPES = [
('fan_mail', 'Fan Mail'),
('review', 'Review'),
('tip', 'Tip'),
('fan_user', 'Fan User'),
('fan_song', 'Fan Song'),
('fan_album', 'Fan Album'),
('played_song', 'Played Song'),
('played_album', 'Played Album'),
('played_radio', 'Played Radio'),
('new_event', 'New Event'),
]
class Feed:
@classmethod
def do_create(cls, **kwargs):
print kwargs
@classmethod
def create(cls, type, **kwargs):
kwargs['feed_type'] = type
cls.do_create(**kwargs)
for type_tuple in FEED_TYPES:
type, name = type_tuple
def notify(self, **kwargs):
print "notifying %s" % type
self.create(type, **kwargs)
notify.__name__ = "notify_%s" % type
setattr(Feed, notify.__name__, classmethod(notify))
Feed.create("FanMail", to_profile="Gerson", from_profile="Felipe")
Feed.notify_fan_mail(to_profile="Gerson2", from_profile="Felipe2")
Die Idee dynamisch eine Klasse ist, Verfahren zu schaffen (wie notify_fan_mail) für jeden Futtersort. Es funktioniert fast super, das einzige Problem ist, dass die Drucken Anweisung immer "Benachrichtigung new_event" druckt, unabhängig von der Methode, die ich anrufe (das gleiche für notify_new_mail, notify_review, etc.).
Ich weiß, dass es ist, weil es den letzten Wert verwendet, der dem Typ zugewiesen wird. Meine Frage ist: Wie kann ich dynamisch Methoden erstellen, die den richtigen Wert für Typ verwenden würden?
Auch, wenn ich genau diesen Code in einer Python-Datei habe, ist das der richtige Weg, Methoden zur Feed-Klasse hinzuzufügen, oder gibt es einen eleganteren Weg?
Vielen Dank! Die Zeilen 'notify = make_notify (typ)' und 'notify .__ name__ =" notify_% s "% typ' sollten' type' (statt 'typ') verwenden, richtig? – kolrie
Hoppla, 'self.create (type, ...)' sollte 'self.create (typ, ...)' sein.Überall, wo du 'type' geschrieben hast, schlage ich vor, etwas anderes zu verwenden, vielleicht" freundlich ", um es vollständig von dem eingebauten Python zu unterscheiden. – unutbu
Liebe die Klasse Dekorateur Konzept! – kolrie