Search code examples
pythonencapsulation

Copy member functions as a way of providing an interface


Is this good Python practice?

import threading
import Queue

class Poppable(threading.Thread):
    def __init__(self):
        super(Poppable, self).__init__()
        self._q = Queue.Queue()
        # provide a limited subset of the Queue interface to clients
        self.qsize = self._q.qsize
        self.get = self._q.get
    def run(self):
        # <snip> -- do stuff that puts new items onto self._q
        # this is why clients don't need access to put functionality

Does this approach of "promoting" member's functions up to the containing class's interface violate the style, or Zen, of Python?

Mainly I'm trying to contrast this approach with the more standard one that would involve declaring wrapper functions normally:

    def qsize(self):
        return self._q.qsize()
    def get(self, *args):
        return self._q.get(*args)

Solution

  • I don't think that is Python specific. In general, this is a good OOP practice. You expose just the functions you need the client to know, hiding the internals of the contained queue. This is a typical approach when wrapping an object, and totally compliant with principle of least knowledge.

    If, instead of self.qsize the client had to call self._q.qsize, you cannot easily change _q with a different data type, which does not have a qsize method if that is needed later. So, your approach, makes the object more open to possible future changes.