A class for C-like structuures in Python

Neil Schemenauer nascheme at news.cnri.reston.va.us
Wed Aug 9 09:59:26 EDT 2000


Thomas Gagne <tgagne at ix.netcom.com> wrote:
>Whoops!!
>
>When I run my test program, I get a tracback that looks like
>__getattr__ calls __checkname which calls __getattr__ which
>calls __checkname.... but I don't see it in the code.

__setattr__ is powerful magic.  You have to be careful.  This
should work better:

    class Struct:
        def __init__(self, **kw):
            self.__dict__["_members"] = kw

        def __checkname(self, name):
            if not self._members.has_key(name):
                raise AttributeError, "No struct-field is named " + name

        def __getattr__(self, name):
            self.__checkname(name)
            return self._members[name]

        def __setattr__(self, name, value):
            self.__checkname(name)
            self._members[name] = value

    def test():
        mystruct = Struct(a=1, b=10)
        print mystruct.a
        mystruct.a = 2
        print mystruct.a

Hint: using self.__dict__ avoids calling __setattr__.

  Neil



More information about the Python-list mailing list