Movatterモバイル変換


[0]ホーム

URL:


HOWTO restrict multiply inherited class to on sub-class

Duncan Boothduncan at rcp.co.uk
Mon Apr 2 12:08:22 EDT 2001


Michael Hudson <mwh21 at cam.ac.uk> wrote in <m37l13b9nj.fsf at atrus.jesus.cam.ac.uk>:>Michael Hudson <mwh21 at cam.ac.uk> writes:>>> > any clues, anyone?>>>> Try this:>>Or, on second thoughts, don't.  It will call Base1's methods even if>they're overridden in Derived, something you almost certainly don't>want.How about this version:=== cast.py ===class Casted:    def __init__(self, wrapped, klass):        self.__wrapped = wrapped        self.__klass = klass    def __getattr__(self, attr):        if hasattr(self.__klass, attr):            return getattr(self.__wrapped, attr)        else:            raise AttributeError, \               ("%s instance has no attribute %s" % (`self.__klass.__name__`, `attr`))def cast(inst, klass):    return Casted(inst, klass)if __name__=='__main__':    class Base1:        def foo(self):            return "Base1 foo"    class Base2:        def bar(self):            return "Base2 foo"    class Derived(Base1, Base2):        def foo(self):            return "Derived foo"    print "Acessing foo, bar, zzz in Derived"    d = Derived()    print "foo", d.foo()    print "bar", d.bar()    try:        print "zzz", d.zzz()    except AttributeError, v:        print "AttributeError", v    print "Acessing foo, bar in Derived cast to Base1"    c = cast(d, Base1)    print "foo", c.foo()    try:        print "bar", c.bar()    except AttributeError, v:        print "AttributeError", v    print "Acessing foo, bar in Derived cast to Base2"    c = cast(d, Base2)    try:        print "foo", c.foo()    except AttributeError, v:        print "AttributeError", v    print "bar", c.bar()    # Casting a Base1 to a Base2 should give us no callable methods.    print "Acessing foo, bar in Base1 cast to Base2"    c2 = cast(Base1(), Base2)    try:        print "foo", c2.foo()    except AttributeError, v:        print "AttributeError", v    try:        print "bar", c2.bar()    except AttributeError, v:        print "AttributeError", v=== end of cast.py ===


More information about the Python-listmailing list

[8]ページ先頭

©2009-2025 Movatter.jp