Python如何使用新的实例值创建新的Object

时间:2014-01-13 16:44:53

标签: python

我创建了一个python脚本来生成随机数并将它们存储在一个列表中但是一旦我运行了脚本,你就得到了相同的值

stat_lst = []
class Sample_stats:
    ts = datetime.now()
    total = randint(10,10000)
    seed = randint(5,5000)
    post_id = randint(0,100)
    site_id = 1
    twitter = randint(5,5000)
    facebook = randint(5,5000)
    gplus = randint(5,5000)
    pinterest = randint(5,5000)
    clicks = randint(5,5000)
    subpage_id = 1
    mouse_overs = randint(5,5000)
    impressions = randint(5,5000)


for num in range(0,20):
    x = Sample_stats()
    stat_lst.append(x)

输出

for item in stat_lst:
    print item.total
你在这里获得相同的价值 谁能告诉我如何从这里生成随机数据?

2 个答案:

答案 0 :(得分:6)

您已将值分配给类属性,这些属性在定义类本身时仅计算一次。创建实例时不会(重新)计算这些属性。

randint()来电转移到__init__方法:

class Sample_stats:
    def __init__(self):
        self.ts = datetime.now()
        self.total = randint(10,10000)
        self.seed = randint(5,5000)
        self.post_id = randint(0,100)
        self.site_id = 1
        self.twitter = randint(5,5000)
        self.facebook = randint(5,5000)
        self.gplus = randint(5,5000)
        self.pinterest = randint(5,5000)
        self.clicks = randint(5,5000)
        self.subpage_id = 1
        self.mouse_overs = randint(5,5000)
        self.impressions = randint(5,5000)

现在,当您使用Sample_stats()创建实例时,每个属性都会在实例上设置。

答案 1 :(得分:2)

虽然@Martijn Pieters完全正确,但我认为需要进一步解释为什么发生这种情况。

Python中的所有内容都是一个对象。类本身,甚至在实例化之前是一个对象,因为它是它自己的元类的一个实例,并且该元类只在类定义时被实例化。

例如:

def myfunc():
    print 'inside myfunc'
    return 'mystring'

class MyClass:
    myattr = myfunc()

当我们执行此代码时(在实例化类之前),我们看到:

>>>inside myfunc

如果我们扩展代码:

my_obj = A()
new_objc = A()

我们没有看到任何输出。

这是因为当Python看到类定义时,它会实例化类的元类。此时,所有类属性都在类对象上设置。实例化类A.myattr重新定义。

因此,您的代码会生成具有相同属性的实例列表。