2016-12-15 38 views
0

我试图定义一个类,其中包括,通过组合物中,faker.Faker()一个实例,并random.Random()具有相同值的为各自seed S:如何在不重复__init__中的setter方法的情况下定义属性?

import faker 
import random 

class DistanceRule(object): 
    def __init__(self, seed=None): 
     self.fake = faker.Faker() 
     self.random = random.Random() 
     self._seed = seed 
     self.seed_fake_and_random() 

    @property 
    def seed(self): 
     return self._seed 

    @seed.setter 
    def seed(self, seed): 
     self._seed = seed 
     self.seed_fake_and_random() 

    def seed_fake_and_random(self): 
     """Seed the instance's faker.Faker() and random.Random() with a 
     single seed value. 
     """ 
     self.fake.seed(self._seed) 
     self.random.seed(self._seed) 

使得运行下面的脚本

if __name__ == "__main__": 
    d1 = DistanceRule(seed=5) 
    print d1.random.randint(1, 10), d1.fake.name() 
    d2 = DistanceRule(seed=12) 
    d2.seed = 5 
    print d2.random.randint(1, 10), d2.fake.name() 

产生

7 Natalie Pope 
7 Natalie Pope 

这捕捉所期望的行为,名称当然,设置seed属性也会重新实现实例的随机数据生成器。唯一令我感到厌烦的是在__init__@seed.setter方法中存在代码重复。有没有更干的方式来做到这一点?

+6

为什么'__init__'不叫'@ seed.setter'方法? –

回答

2

既然你重新定义的制定者,你可以在实例初始化叫它:

def __init__(self, seed=None): 
    self.fake = faker.Faker() 
    self.random = random.Random() 
    self.seed = seed 
相关问题