cython
1# mode: run
2
3
4cdef class Spam:
5
6cdef int tons
7
8cdef void add_tons(self, int x):
9self.tons += x
10
11cdef void eat(self):
12self.tons = 0
13
14def lift(self):
15print self.tons
16
17
18cdef class SubSpam(Spam):
19
20cdef void add_tons(self, int x):
21self.tons += 2 * x
22
23
24def test_spam():
25"""
26>>> test_spam()
275
280
2920
305
31"""
32cdef Spam s
33cdef SubSpam ss
34s = Spam()
35s.eat()
36s.add_tons(5)
37s.lift()
38
39ss = SubSpam()
40ss.eat()
41ss.lift()
42
43ss.add_tons(10)
44ss.lift()
45
46s.lift()
47
48
49cdef class SpamDish:
50cdef int spam
51
52cdef void describe(self):
53print "This dish contains", self.spam, "tons of spam."
54
55
56cdef class FancySpamDish(SpamDish):
57cdef int lettuce
58
59cdef void describe(self):
60print "This dish contains", self.spam, "tons of spam",
61print "and", self.lettuce, "milligrams of lettuce."
62
63
64cdef void describe_dish(SpamDish d):
65d.describe()
66
67
68def test_spam_dish():
69"""
70>>> test_spam_dish()
71This dish contains 42 tons of spam.
72This dish contains 88 tons of spam and 5 milligrams of lettuce.
73"""
74cdef SpamDish s
75cdef FancySpamDish ss
76s = SpamDish()
77s.spam = 42
78ss = FancySpamDish()
79ss.spam = 88
80ss.lettuce = 5
81describe_dish(s)
82describe_dish(ss)
83