为类属性

时间:2017-09-28 10:14:04

标签: python python-3.x numpy random

我有以下代码:

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

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

2 个答案:

答案 0 :(得分: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 ,请在方法中移动变量<info> <parent index='0'> <name>test1</name> <children> </children> </parent> <parent index='1'> <name>test2</name> <children> <VALUE index='0'>test3</VALUE> <VALUE index='1'>test4</VALUE> </children> </parent> <parent index='2'> <name>test3</name> <impvalue>true</impvalue> </parent> <parent index='3'> <name>test4</name> <impvalue>false</impvalue> </parent> </info> 的实例化

<info>
    <parent index='0'>
        <name>test1</name>
        <children>
        </children>
        <impvalue>false</impvalue>
    </parent>
    <parent index='1'>
        <name>test2</name>
        <children>
            <VALUE index='0'>test3</VALUE>
            <VALUE index='1'>test4</VALUE>
        </children>
        <impvalue>true</impvalue>
    </parent>
    <parent index='2'>
        <name>test3</name>
        <impvalue>true</impvalue>
    </parent>
    <parent index='3'>
        <name>test4</name>
        <impvalue>false</impvalue>
    </parent>
</info>

答案 1 :(得分:2)

该行为的原因是属性的默认值正在初始化并且只设置一次,因此代码片段random.randint(18,65)将被执行并设置为age的默认值,这就是具有相同默认值的原因如果没有提供年龄,则为年龄。

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

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

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