无法更改派生类的默认参数列表

时间:2018-11-22 11:34:19

标签: python python-2.7

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

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只被调用了一次。我希望每次实例启动时都调用它。可以做到而又不会弄乱函数签名吗?

2 个答案:

答案 0 :(得分:3)

默认参数在可调用的创建时间评估。

当前,genvalue在构建程序__init__时正好在程序中被调用一次,以便将x的默认值绑定到该方法。 / p>

演示:

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

答案 1 :(得分:2)

genfunc仅被调用一次-首次读取类描述时。该参数在此处评估-每次创建类时都不会评估该参数。

相反,将默认值设置为None,如果没有提供值,则改为在您的__init__方法中生成它。

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

        self.x = x