如何定义属性而不重复\uu init中的setter方法?

2024-10-01 00:18:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图定义一个类,它通过组合包含一个faker.Faker()random.Random()的实例,它们各自的seed具有相同的值:

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方法中存在代码重复。有没有更干净利落的方法?你知道吗


Tags: and实例nameimportselfdefrandomfake
1条回答
网友
1楼 · 发布于 2024-10-01 00:18:40

因为您重新定义了setter,所以可以在实例初始化时调用它:

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

相关问题 更多 >