如何将类实例用作json或python字典值

时间:2017-05-12 21:30:19

标签: python json parameter-passing

以下是用例。

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

相关联

1 个答案:

答案 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']}}