Bei Verwendung des DDD-Repository-Musters und der Kontextzuordnung wollte ich der Instanz ein dynamisches Verhalten verleihen. Daher untersuchte ich, wie DCI (Data Context Interaction) in Python realisiert werden kann.
DCI in Python Python-DCI-Paket, das anscheinend aus einem Thread geboren wurde
Es ist ziemlich alt und unbeliebt, aber es ist gut gemacht.
class Person(object):
def __init__(self, name):
self.name = name
from roles import RoleType
class Carpenter(object):
__metaclass__ = RoleType
def chop(self):
return "chop, chop"
Wenn Sie Person definieren, gefällt Carpenter
>>> person = Person("John")
>>> Carpenter(person)
<Person+Carpenter object at 0x...>
Sie können der Person-Instanz Carpenter-Verhalten geben.
Dynamic Mixin
Implementierte eine Funktion, die einer Instanz dynamisch Attribute der Mixin-Klasse hinzufügt.
import types
def mixin(instance, mixin_class):
"""Dynamic mixin of methods into instance - works only for new style classes"""
for name in mixin_class.__dict__:
if name.startswith('__') and name.endswith('__') \
or not type(mixin_class.__dict__[name])==types.FunctionType:
continue
instance.__dict__[name]=mixin_class.__dict__[name].__get__(instance)
class Person(object):
def __init__(self, name):
self.name = name
class CarpenterMixin(object):
def chop(self):
return "chop, chop"
Wie definiert als
>>> person = Person("John")
>>> mixin(person, CarpenterMixin)
>>> person.chop()
'chop, chop'
Es ist relativ einfach. Dynamic Mixin (2)
Eine aggressive Methode zum dynamischen Umschreiben des Vererbungsbaums einer Instanzklasse. Die Erklärung wird weggelassen. Bitte beachten Sie den Link.
Ich denke, es ist möglich, das Verhalten der Instanz selbst aufzugeben und es mit der Delegation zu realisieren.
Ich habe stark auf die folgenden Seiten verwiesen.
Recommended Posts