以下是用例。
class EvaluateCustomMethod(object):
faker = Faker()
def __init__(self, custom_method, cardinality=1):
self.custom_method = custom_method
self.cardinality = cardinality
@property
def random_first_name(self):
return self.faker.first.name()
def call_method_n_times(self):
return [getattr(self, self.custom_method) \
for _ in range(self.cardinality)]
f = EvaluateCustomMethod('random_first_name', 1)
f.call_method_n_times()
我试图找到一种方法,在实例化对象并在创建实例时直接实现目标时,我不必进行方法调用。
我的最终目标是:
{"test" : {"name" : EvaluateCustomMethod('random_first_name', 1)}}
这与之前的question
相关联答案 0 :(得分:1)
接下来的答案是 不 ,因为想要做的事情非常有可能是重构需求的强烈信号。
一种可能性是使用构造函数__new__
,以确定实例化类时将返回的内容。如下
class EvaluateCustomMethod(object):
faker = Faker()
def __new__(cls, custom_method, cardinality=1):
instance = super(EvaluateCustomMethod, cls).__new__(cls)
instance.custom_method = custom_method
instance.cardinality = cardinality
return instance.call_method_n_times()
@property
def random_first_name(self):
return self.faker.first.name()
def call_method_n_times(self):
return [getattr(self, self.custom_method) \
for _ in range(self.cardinality)]
哪会返回
>>> EvaluateCustomMethod('random_first_name', 1)
['John']
>>> {"test" : {"name" : EvaluateCustomMethod('random_first_name', 1)}}
{"test" : {"name" : ['Jack']}}
<小时/> 但实际上,如此压倒
__new__
是如此沮丧,你可能想要做的更经典的是
class EvaluateCustomMethod(object):
faker = Faker()
def __init__(self, custom_method, cardinality=1):
self.custom_method = custom_method
self.cardinality = cardinality
@property
def random_first_name(self):
return self.faker.first.name()
def call_method_n_times(self):
return [getattr(self, self.custom_method) \
for _ in range(self.cardinality)]
def __call__(self):
return self.call_method_n_times()
返回相同的东西,但完全按照人们认为的那样做
>>> EvaluateCustomMethod('random_first_name', 1)
['Jacques']
>>> {"test" : {"name" : EvaluateCustomMethod('random_first_name', 1)()}}
{"test" : {"name" : ['Richard']}}