【问题标题】:Generating random number for class attribute为类属性生成随机数
【发布时间】:2018-03-10 01:06:47
【问题描述】:

我有以下代码:

from numpy import random

class Person():

    def __init__(self, name, age=random.randint(18,65)):
        self.name = name
        self.age = age

除非明确指定,否则我希望年龄是 18 到 65 之间的随机数。但是,当我创建此类的不同实例时,如下所示:

p1 = Person('Bob')
p2 = Person('Sue')
p3 = Person('Jeff')

每个人的年龄总是相同的。我该如何解决这个问题?

【问题讨论】:

    标签: python python-3.x numpy random


    【解决方案1】:

    这种行为的原因是属性的默认值被初始化并只设置一次,因此代码 sn-p random.randint(18,65) 将被执行并设置为年龄的默认值,这就是具有相同默认值的原因如果未提供年龄,则为年龄。

    解决问题将默认值设置为无,并根据需要执行检查和分配随机值:

    from numpy import random
    
    
    class Person():
    
        def __init__(self, name, age=None):
            if age is None:
                age = random.randint(18,65)
            self.name = name
            self.age = age
    

    关于默认属性的有用信息:

    【讨论】:

      【解决方案2】:

      age 总是相同的原因是因为 age 参数的值是在定义方法 __init__ 时定义的,并且不会在每次调用方法时重新创建,移动如果您希望每次调用方法时都更改此变量,则方法内的变量age

      from numpy import random
      
      class Person():
          def __init__(self, name, age=None):
              self.name = name
              self.age = age if age else random.randint(18, 65)
      
      p1 = Person('Bob')
      p2 = Person('Sue', 20)
      p3 = Person('Jeff')
      
      print(p1.age)
      >> 56
      print(p2.age)
      >> 20
      print(p3.age)
      >> 20
      
      print(Person('Sue', 20).age)
      >> 20
      

      【讨论】:

      • Person('Sue', 0) 的年龄值是多少?
      • @AndriyIvaneyko 是 20,你的答案是这个答案的精确副本,怎么是 0?
      • 是的,它超级相似,但不一样,if ageif age is None 完全不同,从我的角度来看,这也是给出另一个答案的原因感兴趣的原因)。
      • 我对差异感兴趣?一个测试一个值是否为 NoneType,另一个检查这些值是否不 = 0?对吗?
      • 不,一个检查 NoneType 另一个检查值是否是假的(更多:docs.python.org/2.4/lib/truth.html
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 2018-05-20
      • 1970-01-01
      • 2021-05-15
      • 2023-01-03
      相关资源
      最近更新 更多