comparison python/example/abstract.py @ 550:9149b35b8a2a

python/example/abstract.py
author Jeff Hammel <jhammel@mozilla.com>
date Mon, 18 Nov 2013 16:17:39 -0800
parents 37f8bc525888
children
comparison
equal deleted inserted replaced
549:3168816f2d28 550:9149b35b8a2a
1 #!/usr/bin/env
2
3 """
4 demo related to abstract classes
5 """
6
7 ### roll our own to demo
1 8
2 def abstractmethod(method): 9 def abstractmethod(method):
3 line = method.func_code.co_firstlineno 10 line = method.func_code.co_firstlineno
4 filename = method.func_code.co_filename 11 filename = method.func_code.co_filename
5 def not_implemented(*args, **kwargs): 12 def not_implemented(*args, **kwargs):
19 class ConcreteClass(AbstractBaseClass): 26 class ConcreteClass(AbstractBaseClass):
20 27
21 def foo(self, arg): 28 def foo(self, arg):
22 print 'hello' 29 print 'hello'
23 30
31
32 ### now use the abc module
33
34 import abc
35
36 class AbstractClass(object):
37 @abc.abstractmethod
38 def foo(self, arg):
39 """blah"""
40 @abc.abstractmethod
41 def bar(self):
42 """bar does nothing"""
43
44 class CementClass(AbstractBaseClass):
45 def foo(self, arg):
46 print 'goodbye'
47
48 class Picasso(object):
49 __metaclass__ = abc.ABCMeta
50 @abc.abstractmethod
51 def foo(self, arg):
52 """blah"""
53
54
24 if __name__ == '__main__': 55 if __name__ == '__main__':
56
57 # home-rolled
25 c = ConcreteClass() 58 c = ConcreteClass()
26 c.foo(1) 59 c.foo(1)
27 a = AbstractBaseClass() 60 a = AbstractBaseClass()
28 try: 61 try:
29 a.foo(1) 62 a.foo(1)
32 try: 65 try:
33 a.bar() 66 a.bar()
34 except NotImplementedError, e: 67 except NotImplementedError, e:
35 print e 68 print e
36 c.foo(1) 69 c.foo(1)
37 a.foo(1) 70 try:
71 a.foo(1)
72 except NotImplementedError, e:
73 print e
38 74
75 ### abc
76 print '\nIllustrate `abc` functionality'
77 a = AbstractClass()
78 e = None
79 try:
80 a.foo(1)
81 # you'd think this would raise an exception since`
82 # `AbstractClass.foo` is decorated with `abc.abstractmethod`
83 # But see http://docs.python.org/2/library/abc.html :
84 # "Using this decorator requires that the class's metaclass
85 # is ABCMeta or is derived from it."
86 except Exception, e:
87 pass
88 assert e is None # !
39 89
90 # as an aside, another good reason not to use super:
91 # "Unlike Java abstract methods, these abstract methods may
92 # have an implementation. This implementation can be called via the super()
93 # mechanism from the class that overrides it. This could be useful as
94 # an end-point for a super-call in a framework that uses cooperative
95 # multiple-inheritance."
96
97 a = Picasso()
98 e = None
99 try:
100 a.foo(1)
101 except Exception, e:
102 pass
103 import pdb; pdb.set_trace()