Scope of decorator argument

G

Gregor Horvath

Hi,

this:

class base(object):
@adecorator(xy)
def edit(self):
print "edit"

class child(base):
xy = 3


obviously fails because "xy" is not bound at class creation time of the
base object.

One solution could be delegation:

class base(object):
@classmethod
def edit(self):
print "do the real work here"

class child(object):
xy = 3
mybase = base

@adecorator(xy)
def edit(self, *args, **kwargs):
self.mybase.edit(*args, **kwargs)

But then I have the ugly boiler plate delegation code in child.

Is there any other solution, probably with metaclasses ?
 
G

Gregor Horvath

Gregor said:
Is there any other solution, probably with metaclasses ?

I've found this one:

class mymeta(type):
def __new__(meta, class_name, bases, new_attrs):
new_attrs["edit"] = adecorator(new_attrs['xy'])(bases[0].edit))
return type.__new__(meta, class_name, bases, new_attrs)

class base(object):
def edit(self):
print "%s edit" % self

class child(base):
__metaclass__ = mymeta
xy = 3


Don't know if it's the best solution but it seems to work.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,011
Latest member
AjaUqq1950

Latest Threads

Top