replace the base class
aspineux
aspineux at gmail.com
Thu May 31 07:38:51 EDT 2007
Larry: Using "as", I cannot use both Circle and ColorCircle or more
like 3DCircle ... at the same time, only one of them.
But this is a easy solution in some cases.
On 31 mai, 00:25, Matimus <mccre... at gmail.com> wrote:
Hi Martimus, your idea was a good one, I used it to meet my
_particular_ needs.
I was expecting something more complicate with metaclass, object
introspection ....
I used an interface (like in Java, a class with just method that must
work in //
with anoter class).
Finally the "replacement" of the base class in done with a simple :
class ColorCircle(ColorGraphInterface, Circle):
graph_base_class=Circle
Here is my full working test code
class Graph:
def plot(self):
print 'Graph.plot'
class Circle(Graph):
def draw(self):
print 'Circle.draw'
self.plot()
class Square(Graph):
def draw(self):
print 'Square.draw'
self.plot()
class ColorGraphInterface:
graph_base_class=None
def plot(self):
print 'ColorGraphInterface.plot'
self.graph_base_class.plot(self)
def draw(self):
print 'ColorGraphInterface.draw'
self.graph_base_class.draw(self)
class ColorCircle(ColorGraphInterface, Circle):
graph_base_class=Circle
class ColorCircle(ColorGraphInterface, Square):
graph_base_class=Square
cc=ColorCircle()
cc.draw()
> This is a rather simplistic example, but you may be able to use a
> mixin class to achieve what you need. The idea is that you write a
> class that overrides only what is needed to add the new functionality.
> For you it would be Color.
>
> [code]
> class Graph(object):
> def _foo(self):
> print "Graph._foo"
>
> class Color(object):
> def _foo(self):
> print "Color._foo"
>
> class Circle(Graph):
> def bar(self):
> self._foo()
>
> class ColorCircle(Color,Circle): # the order of parent classes is
> important
> pass
>
> if __name__ == "__main__":
> c1 = Circle()
> c2 = ColorCircle()
>
> c1.bar() #prints: Graph._foo
> c2.bar() #pritns: Color._foo
> [/code]
>
> You might not have to do anything already. Try this and see if it
> works:
>
> [code]
>
> ColorCircle(ColorGraph,Circle):
> pass
>
> [/code]
>
> Note that you will probably have to create an __init__ method, and
> explicitly call the __init__ methods for the base classes. If the
> __init__ for Circle ends up calling the __init__ method from Graph,
> you may have issues. That is why the Color mixin that I created
> inherited from object not Graph. It helps to avoid clashing __init__
> methods.
Yes I know, super() do a great job for that :-)
>
> Matt
More information about the Python-list
mailing list