Peter Otten wrote:
Terry Reedy wrote:


If the names of superclasses is resolved when classes are instantiated,
the patching is easy.  If, as I would suspect, the names are resolved
when the classes are created, before the module becomes available to the
importing code, then much more careful and extensive patching would be
required, if it is even possible.  (Objects in tuples cannot be
replaced, and some attributes are not writable.)

It may be sufficient to patch the subclasses:

I was not sure if __bases__ is writable or not. There is also __mro__ to consider.

$ cat my_file.py
class Super(object):
    def __str__(self):
        return "old"

class Sub(Super):
    def __str__(self):
        return "Sub(%s)" % super(Sub, self).__str__()

class Other(object):
    pass

class SubSub(Sub, Other):
    def __str__(self):
        return "SubSub(%s)" % super(SubSub, self).__str__()

if __name__ == "__main__":
    print Sub()

$ cat main2.py
import my_file
OldSuper = my_file.Super

class NewSuper(OldSuper):
    def __str__(self):
        return "new" + super(NewSuper, self).__str__()

my_file.Super = NewSuper
for n, v in vars(my_file).iteritems():
    if v is not NewSuper:
        try:
            bases = v.__bases__
        except AttributeError:
            pass
        else:
            if OldSuper in bases:
                print "patching", n
                v.__bases__ = tuple(NewSuper if b is OldSuper else b
                                    for b in bases)


print my_file.Sub()
print my_file.SubSub()
$ python main2.py
patching Sub
Sub(newold)
SubSub(Sub(newold))

Peter


--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to