Dave Kuhlman wrote: > Arnaud Delobelle wrote: > >> >> 4. Both points above follow from the fact that foo.bar is really a >> function call that returns a (potentially) new object: in fact what >> really happens is something like > > Arnaud and Imri, too - > > No. foo.bar is *not* really a function/method call. > >> >> Foo.__dict__['bar'].__get__(foo, Foo). >> >> So every time foo.bar is executed an object is (or may be) created, >> with a new id. >> >> HTH > > I appreciate the help, but ... > > Actually, it does not help, because ... > > My understanding is that foo.bar does *not* create a new object. All it > does is return the value of the bar attribute of object foo. What new > object is being created?
If the attribute has a __get__() method that's completely under the attribute's control: >>> class Bar(object): ... def __get__(self, *args): ... print "__get__%s" % (args,) ... return self.next() ... def next(self): ... self.count += 1 ... return self.count ... count = -1 ... >>> class Foo(object): ... bar = Bar() ... def __repr__(self): return "foo" ... >>> foo = Foo() >>> foo.bar __get__(foo, <class '__main__.Foo'>) 0 >>> foo.bar __get__(foo, <class '__main__.Foo'>) 1 >>> foo.bar __get__(foo, <class '__main__.Foo'>) 2 >>> getattr(foo, "bar") __get__(foo, <class '__main__.Foo'>) 3 Peter -- http://mail.python.org/mailman/listinfo/python-list