annotate python/example/abstract.py @ 913:107bf2430602

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