On Fri, 16 Mar 2012 22:30:34 -0700, Cosmia Luna wrote: > I'm porting my existing work to Python 3.X, but... > > class Foo: > def bar(self): > pass > > mthd = Foo.bar > > assert mthd.im_class is Foo # this does not work in py3k > > So, how can I get a reference to Foo? This is important when writing > decorators, the only way I can think out is:
I don't believe you can get a reference to Foo just by inspecting the function object Foo.bar. (In Python 2.x, Foo.bar would be an unbound method, but they no longer exist in Python 3.x.) > class Foo: > def bar(self): > 'Foo' # manually declare the owner class > pass A better approach might be to inject a reference to the class after the event, using a class decorator: function = type(lambda: None) def inject_class(cls): for name, obj in vars(cls).items(): if type(obj) is function: obj.owner_class = cls return cls And in use: py> @inject_class ... class Test: ... a = 1 ... b = 2 ... def method(self, x): ... return (x, self) ... py> Test.a 1 py> Test.method <function method at 0xb7b21bec> py> Test.method.owner_class is Test True Does this help? -- Steven -- http://mail.python.org/mailman/listinfo/python-list