这是我拥有的最小化脚本:
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只被调用了一次。我希望每次实例启动时都调用它。可以做到而又不会弄乱函数签名吗?
答案 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