python - 无法改变派生类的默认参数列表
问题描述
这是我拥有的最小化脚本:
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 只被调用一次。我希望每次启动实例时都调用它。是否可以在不弄乱函数签名的情况下做到这一点?
解决方案
默认参数在可调用创建时进行评估。
目前,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()
推荐阅读
- selenium - 在黄瓜中执行步骤定义后要执行的公共代码
- json - “响应代码”断言后的jmeter条件执行
- linux - 这个功能怎么做?(这个功能叫什么名字?)
- java - Maven Release Plugin 自增自定义格式版本
- macos - 钥匙串中的 macOS 安装程序证书评估错误:无效的扩展密钥用法
- api - 跨多个无状态 API 应用程序的用户管理
- python - 如何抓取谷歌搜索结果页面?
- javascript - Vue插件,添加获取数据的全局组件
- c# - 计算日期时间列表中的总分钟数
- google-cloud-dataflow - 谷歌数据流 CombineFn add_input 失败