Skip to content

Instantly share code, notes, and snippets.

@Ikke
Last active December 16, 2015 15:19
Show Gist options
  • Save Ikke/5455351 to your computer and use it in GitHub Desktop.
Save Ikke/5455351 to your computer and use it in GitHub Desktop.
DCI in python: Adding and deleting methods from objects.
def add_role(subject, role):
for name, function in inspect.getmembers(role, predicate=inspect.isfunction):
setattr(subject, name, types.MethodType(function, subject))
def remove_role(subject, role):
for name, function in inspect.getmembers(role, predicate=inspect.isfunction):
delattr(subject, name)
class Person:
pass
class Greeter:
def greet(self):
print("Hi")
p = Person()
add_role(p, Greeter)
p.greet()
remove_role(p, Greeter)
p.greet()
#>>> p = Person()
#>>> add_role(p, Greeter)
#>>> p.greet()
#Hi
#>>> remove_role(p, Greeter)
#>>> p.greet()
#Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
#AttributeError: 'Person' object has no attribute 'greet'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment