This is my try at the proxy pattern.
What do you Pythoneers think of my attempt?
class Image:
def __init__( self, filename ):
self._filename = filename
def load_image_from_disk( self ):
print("loading " + self._filename )
def display_image( self ):
print("display " + self._filename)
class Proxy:
def __init__( self, subject ):
self._subject = subject
self._proxystate = None
class ProxyImage( Proxy ):
def display_image( self ):
if self._proxystate == None:
self._subject.load_image_from_disk()
self._proxystate = 1
print("display " + self._subject._filename )
proxy_image1 = ProxyImage ( Image("HiRes_10Mb_Photo1") )
proxy_image2 = ProxyImage ( Image("HiRes_10Mb_Photo2") )
proxy_image1.display_image() # loading necessary
proxy_image1.display_image() # loading unnecessary
proxy_image2.display_image() # loading necessary
proxy_image2.display_image() # loading unnecessary
proxy_image1.display_image() # loading unnecessary
Output:
loading HiRes_10Mb_Photo1
display HiRes_10Mb_Photo1
display HiRes_10Mb_Photo1
loading HiRes_10Mb_Photo2
display HiRes_10Mb_Photo2
display HiRes_10Mb_Photo2
display HiRes_10Mb_Photo1
1 Answer 1
It seems like overkill to implement a class to represent the proxy pattern. Design patterns are patterns, not classes. What do you gain from your implementation compared to a simple approach like the one shown below?
class Image(object):
def __init__(self, filename):
self._filename = filename
self._loaded = False
def load(self):
print("loading {}".format(self._filename))
self._loaded = True
def display(self):
if not self._loaded:
self.load()
print("displaying {}".format(self._filename))
Some other notes on your code:
It doesn't follow PEP8. In particular, "Avoid extraneous whitespace [...] immediately inside parentheses."
No docstrings.
It makes more sense to use
True
andFalse
for a binary condition than to useNone
and1
.It's not necessary to append the class name to all the methods. In a class called
Image
, the methods should just be calledload
anddisplay
, notload_image
anddisplay_image
.You should use new-style classes (inheriting from
object
) to make your code portable between Python 2 and 3.
-
\$\begingroup\$ I think it can make sense to have separate
Image
andImageProxy
objects (though a better name might be something likeLazyImage
), because of separation of concerns. And even better (assuming the added complexity would be worth it) would be some sort of genericLazyLoadingProxy
class, which could work withImage
s and also other objects. \$\endgroup\$svick– svick2013年01月22日 14:08:17 +00:00Commented Jan 22, 2013 at 14:08 -
1\$\begingroup\$ It's possible, but we'd only know in the context of a whole application: if there really are several different types of assets that need to be lazily loaded, then it might make sense to have a class to handle the lazy loading, but it might still be simpler to implement that class as a mixin rather than a proxy. A proxy object is usually a last resort when you don't control the code for the class you are proxying. \$\endgroup\$Gareth Rees– Gareth Rees2013年01月22日 14:17:05 +00:00Commented Jan 22, 2013 at 14:17