I want to instrument a class via a decorator, to add some instance variables that are specified by the author of the class.
I started with the following code, but this just adds class variables and I want instance variables (those that are normally 'declared' in __ init __)
What is a pythonic way to do this, while allowing the class author control over what they put in __ init __?
def add_list_attributes(klass):
for attribute in klass.list_attributes:
setattr(klass, attribute, [])
return klass
@add_list_attributes
class Person(object):
list_attributes = [
'phone_numbers'
]
def __init__(self):
pass
p1 = Person()
p1.phone_numbers.append('01234')
print p1.phone_numbers
您必须将__init__()
包装在一个单独的函数中,该函数将调用原始方法,然后将其自己的属性添加到第一个参数。
You can do this by wrapping the __init__
method to do your bidding, and then call the original __init__
:
def add_list_attributes(klass):
old_init = klass.__init__
def new_init(self, *args, **kwargs):
for attribute in klass.list_attributes:
setattr(self, attribute, [])
old_init(self, *args, **kwargs)
klass.__init__ = new_init
return klass
@add_list_attributes
class Person(object):
list_attributes = [
'phone_numbers'
]
def __init__(self):
pass
p1 = Person()
p1.phone_numbers.append('01234')
p2 = Person()
p2.phone_numbers.append('56789')
print p1.phone_numbers
print p2.phone_numbers
You can create a custom __new__
method:
def add_list_attributes(klass):
def new(cls, *args, **kwargs):
result = super(cls, cls).__new__(cls)
for attribute in klass.list_attributes:
setattr(result, attribute, [])
return result
klass.__new__ = staticmethod(new)
return klass
@add_list_attributes
class Person(object):
list_attributes = [
'phone_numbers'
]
def __init__(self):
pass
p1 = Person()
p2 = Person()
p1.phone_numbers.append('01234')
print p1.phone_numbers, p2.phone_numbers
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.