Inheritance question

Peter Otten __peter__ at web.de
Mon Sep 20 10:24:58 EDT 2004


Yannick Turgeon wrote:

> is there a way that I could change my class A to something like:
> 
> class A:
>     _value
>     __init__(self, value):
>         self._value = value
>         if value > 10:
>             set myself as an instance of B1   # How can I do that?
>         else:
>             set myself as an instance of B2
> 
> in the real situation "value" is encoded and the way to know what kind of
> A it is, is more complex than just look at the value.

[Requires newstyle classes]

>>> class A(object):
...     def __new__(cls, value):
...             if value > 10:
...                     return super(cls, A).__new__(B1, value)
...             else:
...                     return super(cls, A).__new__(B2, value)
...     def __init__(self, value):
...             self._value = value
...
>>> class B1(A):
...     def doPrint(self):
...             print "B1:", self._value
...
>>> class B2(A):
...     def doPrint(self):
...             print "B2:", self._value
...
>>> A(1).doPrint()
B2: 1
>>> A(100).doPrint()
B1: 100

You can do it, but it's certainly bad design because A has to know all its
subclasses. If you go with the above I recommend that you use some kind of
registry instead of hardcoding the subclasses in A.__new__().

Peter




More information about the Python-list mailing list