Understanding the pythonic way: why a.x = 1 is better than a.setX(1) ?

Ivan Illarionov ivan.illarionov at gmail.com
Thu Sep 4 17:05:41 EDT 2008


On 4 сент, 21:49, Bruno Desthuilliers
<bdesth.quelquech... at free.quelquepart.fr> wrote:
> Ivan Illarionov a écrit :
>
>
>
> > On 4 сент, 22:59, Carl Banks <pavlovevide... at gmail.com> wrote:
> >> You can write code to guard against this if you want:
>
> >> class A:
> >>     legal = set(["x"])
> >>     def __setattr__(self,attr,val):
> >>         if attr not in self.legal:
> >>             raise AttributeError("A object has no attribute '%s'" %
> >> attr)
> >>         self.__dict__[attr] = val
> >>     def __init__(self,x):
> >>         self.y = x
>
> >> I suspect most people who go into Python doing something like this
> >> soon abandon it when they see how rarely it actually catches anything.
>
> > '__slots__' is better:
>
> For which definition of "better" ? __slots__ are a mean to optimize
> memory usage, not to restrict dynamism. Being able to dynamically add
> arbitrary attributes is actually a feature, not a bug, and uselessly
> restricting users from doing so is not pythonic. IOW : don't do that.

Carl's example is restricting dynamism in the same way as __slots__.
I've just suggested a better implementation. It is not me who
suggested dynamism restriction as a way to guard against errors.



More information about the Python-list mailing list