Subclassing str object

Ian Kelly ian.g.kelly at gmail.com
Wed Aug 31 13:11:16 EDT 2011


2011/8/31 Yaşar Arabacı <yasar11732 at gmail.com>:
> I made a class like this (I shortened it just to show the point), what do
> you think about it, do you think it is the python way of subclassing str (or
> unicode in this case)

You don't need the _sozcuk attribute at all here.  It's just the same
as the value of the unicode object itself.  The code could be
simplified to:

class kelime(unicode):

    def __getattribute__(self, isim):
        att = super(kelime, self).__getattribute__(isim)
        if not callable(att):
            return att
        def sonra_cagir(*args, **kwargs):
            sonuc = att(*args, **kwargs)
            if isinstance(sonuc, basestring):
                return kelime(sonuc)
            return sonuc
        return sonra_cagir

    def cogul(self):
        for harf in reversed(self):
            if harf in kalin:
                return kelime(self + u"lar")
            elif harf in ince:
                return kelime(self + u"ler")
        return kelime(self + u"lar")

Also, "isinstance(sonuc, basestring)" should probably be
"isinstance(sonuc, unicode)".  Otherwise you'll break the encode
method.

If you want "kelime(u'one') + kelime(u'two')" to return a kelime
instance, you'll need to override the __add__ special method as well.
Likewise for "kelime(u'repeat') * 20" and the __mul__ method.  You'll
also want to override __getitem__ so that slicing returns a kelime
instance as expected.

Finally, I gather that the goal of this is not to modify the behavior
of the unicode class at all, but just to add custom methods?  I would
strongly recommend that you not use a subclass for this, and instead
just write some functions that take a string to operate on as an
argument.  Subclassing built-in types tends to be tricky as you can
see, and this doesn't seem like a good reason to attempt it.

Cheers,
Ian



More information about the Python-list mailing list