我想调用一个以类作为参数的函数,而不传递类。
该函数仅使用类中的整数值,我调用它的位置具有可以独立计算值的信息。
我的代码如下:
我想打电话的功能:
def buckets_from_pairs(fs_pairs,par):
fsea=fermi_sea(par.N)
# rest of function has no reference to par
我打来的功能:
def deltas(roots):
if "buckets" in roots:
# do function on roots["buckets"]
if "partition" in roots:
#somehow define value such that value.N=len(roots["roots"])
buckets=buckets_from_pairs(roots["partition"], value)
#do function on buckets
我可以更改deltas
以par
作为参数,我可以将buckets_from_pairs
更改为不使用par
,但两者都需要进行大量修改,我会我必须与我的主管一起组织这两个职能(他没有这个问题)。
所以我希望有一种更简单的方法来创建一个可以使用“点”引用某些东西的对象,而不是在调用函数中创建一个新类。
答案 0 :(得分:4)
你可以制作这样的小适配器:
class Adapter(object):
def __init__(self, n):
self.N = n
然后:
buckets=buckets_from_pairs(roots["partition"], Adapter(len(roots["roots"]))
答案 1 :(得分:4)
from collections import namedtuple
value = namedtuple('Value', 'N')(len(roots["roots"]))
答案 2 :(得分:2)
为什么不
def buckets_from_pairs(fs_pairs, N):
fsea=fermi_sea(N)
用
调用buckets=buckets_from_pairs(roots["partition"], value.N)
答案 3 :(得分:1)
@gnibbler答案很好,@ John Zwinck有个好主意,但它可以变得一般:
class objval(object):
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
par = objval(N=len(roots["roots"])
通常,objval
允许您动态创建包含在对象中的值,如:
o = objval(prop1=value1, prop2=value2)
您选择的解决方案归结为品味。
答案 4 :(得分:1)
如果值应该是可修改的;你可以在Python 3.3 +中使用types.SimpleNamespace类:
from types import SimpleNamespace
value = SimpleNamespace(N=len(roots["roots"]))
在较旧的Python版本上,您可以使用Adapter class。
对于只读案例;你可以使用namedtuple
。