Extending Classes with Mixins
Problem
You have a collection of generally useful methods that you would like to make available for extending the functionality of other class definitions. However, the classes where the methods might be added aren’t necessarily related to one another via inheritance. Thus, you can’t just attach the methods to a common base class.
Solution
The problem addressed by this Shortcut often arises in code where one is interested in the issue of class customization. For example, maybe a library provides a basic set of classes along with a set of optional customizations that can be applied if desired by the user.
To illustrate: suppose you have an interest in adding various customizations (e.g., logging, set-once, type checking) to mapping objects. Here are a set of mixin classes that do that:
class
LoggedMappingMixin
(
object
):
'''
Add logging to get/set/delete operations for debugging.
'''
__slots__
=
()
def
__getitem__
(
self
,
key
):
(
'Getting '
+
str
(
key
))
return
super
()
.
__getitem__
(
key
)
def
__setitem__
(
self
,
key
,
value
):
(
'Setting
{}
=
{!r}
'
.
format
(
key
,
value
))
return
super
()
.
__setitem__
(
key
,
value
)
def
__delitem__
(
self
,
key
):
(
'Deleting '
+
str
(
key
))
return
super
()
.
__delitem__
(
key
)
class
SetOnceMappingMixin
(
object
):
'''
Only allow a key to be set once.
Get Extending Classes with Mixins now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.