简体   繁体   English

如何在不重复__init__中的setter方法的情况下定义属性?

[英]How to define a property without repeating the setter method in the __init__?

I'm trying to define a class which includes, through composition, an instance of faker.Faker() and random.Random() with the same value for their respective seed s: 我正在尝试定义一个类,该类通过组合包括一个faker.Faker()random.Random()实例,它们的各自seed s具有相同的值:

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)

so that running the following script 这样运行以下脚本

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

produces 产生

7 Natalie Pope
7 Natalie Pope

This captures the desired behavior, namely that setting the seed property also re-seeds the instance's random data generators. 这捕获了所需的行为,即设置seed属性也重新种子了实例的随机数据生成器。 The only thing that irks me is that there is code repetition in the __init__ and @seed.setter methods. 唯一令我@seed.setter__init__@seed.setter方法中存在代码重复。 Is there a more DRY way to do this? 还有更干的方法吗?

Since you redefine the setter, you can call it at instance initialization: 由于您重新定义了setter,因此可以在实例初始化时调用它:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM