2016-12-15 5 views
0

私は、それぞれのseedのための同じ値で、構図によって、含まれてクラスを定義するfaker.Faker()random.Random()のインスタンスをしようとしている。そのように次のスクリプトを実行すると、__init__でsetterメソッドを繰り返さずにプロパティを定義する方法は?

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() 

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) 

7 Natalie Pope 
7 Natalie Pope 

これは望ましい動作をキャプチャし、名前を生成しますこの場合、seedプロパティを設定すると、インスタンスのランダムデータジェネレータも再シードされます。唯一のことは、__init__とのコードの繰り返しがあることです。これを行うにはDRY方法がありますか?

+6

なぜ '' __init__' @ seed.setter'メソッドを呼び出すことはありませんか? –

答えて

2

あなたがセッターを再定義するので、あなたは、インスタンスの初期化でそれを呼び出すことができます。

def __init__(self, seed=None): 
    self.fake = faker.Faker() 
    self.random = random.Random() 
    self.seed = seed 
関連する問題