Bruno Desthuilliers wrote:
Alexander Kapps a écrit :
(snip)
While I personally don't agree with this proposal (but I understand
why some people might want it), I can see a reason.
When disallowing direct attribute creation, those typos that seem to
catch newcommers won't happen anymore. What I mean is this:
class Foo(object):
def __init__(self):
self.somearg = 0
f = Foo()
f.soemarg = 42
---^ There, typo, but still working
It's something like a custom __setattr__ that errors out when trying
to assign to an attribute that doesn't exists,
Chicken and egg problem, really : f.__dict__['somearg'] doesn't exists
until "self.somearg = 0" is executed.
The "problem" is that Python's methods are only thin wrapper around
functions (cf http://wiki.python.org/moin/FromFunctionToMethod) so
there's no difference between "self.somearg = 0" in Foo.__init__ and
"f.somearg = 42".
IOW, there's no way to implement this proposal without completely
changing Python's object model.
I must be missing something. Can you please explain why the whole
object model would need to change?
This seems to work quite well:
class TypoProtection(object):
def __init__(self):
self.foo = 42
self.bar = 24
def _setattr(self, name, value):
if name in self.__dict__:
self.__dict__[name] = value
else:
raise AttributeError, "%s has no '%s' attribute" \
% (self.__class__, name)
self.__class__.__setattr__ = _setattr
t = TypoProtection()
t.foo = "spam"
t.bar = "ham"
t.parrot = "dead"
Traceback (most recent call last):
File "typo.py", line 20, in <module>
t.parrot = "dead"
File "typo.py", line 10, in _setattr
raise AttributeError, "%s has no '%s' attribute" %
(self.__class__, name
AttributeError: <class '__main__.TypoProtection'> has no 'parrot'
attribute
So, IIUC, all what would need to be done is to add an implicit
__setattr__ at the end of __init__ .
(Just want to understand, still not advocating this proposal)
--
http://mail.python.org/mailman/listinfo/python-list