在 Python3 中的 class 中动态装饰一个函数
Dynamically decorate a function inside a class in Python3
这是 Dynamic/runtime method creation (code generation) in Python
的扩展
@John Montgommery 正确回答了@Eli Bendersky 的问题,即您可以使用此逻辑动态创建具有函数的 class:
class Dynamo(object):
pass
def add_dynamo(cls,i):
def innerdynamo(self):
print "in dynamo %d" % i
innerdynamo.__doc__ = "docstring for dynamo%d" % i
innerdynamo.__name__ = "dynamo%d" % i
setattr(cls,innerdynamo.__name__,innerdynamo)
for i in range(2):
add_dynamo(Dynamo, i)
d=Dynamo()
d.dynamo0()
d.dynamo1()
我的问题是:如何使用需要参数的装饰器装饰 class 中的结果函数?
例如:
静态函数定义:
class MyTaskSequence(TaskSequence):
@seq_task(1)
def sequence1(self):
self.client.get("/devops/")
@seq_task(2)
def sequence2(self):
self.client.get("/blog/")
我尝试了什么:
class MyTaskSequence(TaskSequence):
pass
def add_sequence(cls, order, path):
def sequence(self):
self.client.get(path)
sequence.__name__ = "sequence%d" % order
setattr(cls, sequence.__name__, seq_task(order)(sequence))
add_sequence(MyTaskSequence, 1, "/devops/")
add_sequence(MyTaskSequence, 2, "/blog/")
创建方法时可以直接应用装饰器:
def add_sequence(cls, order, path):
@seq_task(order)
def sequence(self):
self.client.get(path)
sequence.__name__ = "sequence%d" % order
setattr(cls, sequence.__name__, sequence)
这是 Dynamic/runtime method creation (code generation) in Python
的扩展@John Montgommery 正确回答了@Eli Bendersky 的问题,即您可以使用此逻辑动态创建具有函数的 class:
class Dynamo(object):
pass
def add_dynamo(cls,i):
def innerdynamo(self):
print "in dynamo %d" % i
innerdynamo.__doc__ = "docstring for dynamo%d" % i
innerdynamo.__name__ = "dynamo%d" % i
setattr(cls,innerdynamo.__name__,innerdynamo)
for i in range(2):
add_dynamo(Dynamo, i)
d=Dynamo()
d.dynamo0()
d.dynamo1()
我的问题是:如何使用需要参数的装饰器装饰 class 中的结果函数?
例如: 静态函数定义:
class MyTaskSequence(TaskSequence):
@seq_task(1)
def sequence1(self):
self.client.get("/devops/")
@seq_task(2)
def sequence2(self):
self.client.get("/blog/")
我尝试了什么:
class MyTaskSequence(TaskSequence):
pass
def add_sequence(cls, order, path):
def sequence(self):
self.client.get(path)
sequence.__name__ = "sequence%d" % order
setattr(cls, sequence.__name__, seq_task(order)(sequence))
add_sequence(MyTaskSequence, 1, "/devops/")
add_sequence(MyTaskSequence, 2, "/blog/")
创建方法时可以直接应用装饰器:
def add_sequence(cls, order, path):
@seq_task(order)
def sequence(self):
self.client.get(path)
sequence.__name__ = "sequence%d" % order
setattr(cls, sequence.__name__, sequence)