2016-12-15 41 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 
相關問題