getattr on objects
Bjarke Dahl Ebert
bebert at worldonline.dk
Tue Oct 8 07:57:18 EDT 2002
More information about the Python-list mailing list
Tue Oct 8 07:57:18 EDT 2002
- Previous message (by thread): getattr on objects
- Next message (by thread): getattr on objects
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
"bromden" <bromden at gazeta.pl> wrote in message news:3DA2B669.7070204 at gazeta.pl... > I wanted to make a class which would pretend to have any > method you can call on it (returning some default value). > Defined a class: > >>> class C: > ... def hasattr(self, name): return 1 > ... def getattr(self, name): return self.default > ... def default(self): return 'default' Try this: class C: def __getattr__(self, name): return self.default() def default(self): return 'default' When I wonder how Python communicates with objects (e.g., What is the effect of "foo in myobj"), I just try with a little piece of code: class Foo: def __getattr__(self, name): print name raise AttributeError Now, evaluating "1 in Foo()", reveals the things that Python tries, in order (version 2.2.1): __contains__ __iter__ __getitem__ which makes pretty good sense :-) > Is there a way to "override" hasattr (getattr) or > any other way to achieve the behaviour I described? > (I use python 1.5.2) Hm.. I use 2.2.1, but I don't think this has changed since 1.5.2. hasattr uses the getattr protocol, so you cannot override hasattr without "calculating" the attribute when asked, in __getattr__. So, for objects that does heavy on-the-fly calculation of attributes, it is better to access them with: try: foo = bar.hello except AttributeError: # ... than if hasattr(bar, "hello"): foo = bar.hello # ... else: # ... Kind regards, Bjarke
- Previous message (by thread): getattr on objects
- Next message (by thread): getattr on objects
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Python-list mailing list