Delegating Attribute Access
Problem
You want an instance to delegate attribute access to an internally held instance, possibly as an alternative to inheritance or in order to implement a proxy.
Solution
Simply stated, delegation is a programming pattern where the responsibility for implementing a particular operation is handed off (i.e., delegated) to a different object. In its simplest form, it often looks something like this:
class
A
(
object
):
def
spam
(
self
,
x
):
pass
def
foo
(
self
):
pass
class
B
(
object
):
def
__init__
(
self
):
self
.
_a
=
A
()
def
spam
(
self
,
x
):
# Delegate to the internal self._a instance
return
self
.
_a
.
spam
(
x
)
def
foo
(
self
):
# Delegate to the internal self._a instance
return
self
.
_a
.
foo
()
def
bar
(
self
):
pass
If there are only a couple of methods to delegate, writing code
such as that just given is easy enough. However, if there are many
methods to delegate, an
alternative approach is to define the __getattr__()
method, like this:
class
A
(
object
):
def
spam
(
self
,
x
):
pass
def
foo
(
self
):
pass
class
B
(
object
):
def
__init__
(
self
):
self
.
_a
=
A
()
def
bar
(
self
):
pass
# Expose all of the methods defined on class A
def
__getattr__
(
self
,
name
):
return
getattr
(
self
.
_a
,
name
)
The __getattr__()
method is kind of like a catch-all for attribute lookup. It’s a method that gets called if code tries to ...
Get Delegating Attribute Access 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.