首页 > 解决方案 > 无法改变派生类的默认参数列表

问题描述

这是我拥有的最小化脚本:

import random

def genvalue():
    return random.randint(1, 100)

class A(object):
    def __init__(self, x = genvalue()):
        self.x = x

class B(A):
    def __init__(self):
        super(B, self).__init__()

t1 = A(10)
t2 = B()
t3 = B()

print t1.x
print t2.x
print t3.x

我想要的预期结果是 t1.x 的值为 10,而另外两个具有随机值,但是 t2 和 t3 具有相同的值,就像 genfunc 只被调用一次。我希望每次启动实例时都调用它。是否可以在不弄乱函数签名的情况下做到这一点?

标签: pythonpython-2.7

解决方案


默认参数在可调用创建时进行评估。

目前,genvalue在您的程序中只调用一次,在__init__构建方法时将默认值绑定x到方法。

演示:

import random

def genvalue():
    print('genvalue called')
    return random.randint(1, 100)

class A(object):
    def __init__(self, x=genvalue()):
        self.x = x

print('creating some instances...')
A()
A()
A()
print(A.__init__.__defaults__)

输出:

genvalue called
creating some instances...
(32,)

利用

class A(object):
    def __init__(self, x=None):
        self.x = x if x is not None else genvalue()

推荐阅读