1cdef class Base0: 2 pass 3 4cdef class Base(Base0): 5 pass 6 7cdef class Foo(Base): 8 cdef fooit(self): 9 return 42 10 11cdef class Bar(Foo): 12 pass 13 14cdef class Bam(Bar): 15 pass 16 17cdef class Zoo(Bam): 18 pass 19 20 21def fooit(Foo foo): 22 """ 23 >>> zoo = Zoo() 24 >>> for cl in (Zoo, Bam, Bar, Foo, Base, Base0): assert isinstance(zoo, cl) 25 >>> fooit(zoo) 26 42 27 >>> bam = Bam() 28 >>> for cl in (Bam, Bar, Foo, Base, Base0): assert isinstance(bam, cl) 29 >>> fooit(bam) 30 42 31 >>> bar = Bar() 32 >>> for cl in (Bar, Foo, Base, Base0): assert isinstance(bar, cl) 33 >>> fooit(bar) 34 42 35 >>> foo = Foo() 36 >>> for cl in (Foo, Base, Base0): assert isinstance(foo, cl) 37 >>> fooit(foo) 38 42 39 >>> base = Base() 40 >>> for cl in (Base, Base0): assert isinstance(base, cl) 41 >>> fooit(base) 42 Traceback (most recent call last): 43 TypeError: Argument 'foo' has incorrect type (expected subclasses.Foo, got subclasses.Base) 44 >>> base0 = Base0() 45 >>> for cl in (Base0,): assert isinstance(base0, cl) 46 >>> fooit(base0) 47 Traceback (most recent call last): 48 TypeError: Argument 'foo' has incorrect type (expected subclasses.Foo, got subclasses.Base0) 49 """ 50 return foo.fooit() 51