0

我想调用一个将类作为参数的函数,而不将其传递给类。

该函数仅使用类中的整数值,而我调用它的地方具有可以独立计算该值的信息。

我的代码如下所示:

我要调用的函数:

    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

我可以更改deltaspar作为参数,也可以更改buckets_from_pairs为不工作,par但两者都需要大量返工,而且我必须与编写这两个函数的主管一起组织它(他没有这个问题)。

所以我希望有一种更简单的方法来创建一个可以使用“点”来引用某些东西的对象,而不是在调用函数中创建一个新类。

4

5 回答 5

4

你可以像这样制作一个小适配器:

class Adapter(object):
    def __init__(self, n):
        self.N = n

然后:

buckets=buckets_from_pairs(roots["partition"], Adapter(len(roots["roots"]))
于 2013-02-19T13:56:20.483 回答
4
from collections import namedtuple
value = namedtuple('Value', 'N')(len(roots["roots"]))
于 2013-02-19T13:57:58.743 回答
2

为什么不只是

def buckets_from_pairs(fs_pairs, N):
    fsea=fermi_sea(N)

buckets=buckets_from_pairs(roots["partition"], value.N)
于 2013-02-19T13:54:45.380 回答
1

如果值应该是可修改的;你可以在 Python 3.3+ 中使用types.SimpleNamespace类:

from types import SimpleNamespace

value = SimpleNamespace(N=len(roots["roots"]))

在较旧的 Python 版本上,您可以使用Adapter class

对于只读情况;你可以使用namedtuple.

于 2013-02-19T14:18:50.837 回答
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)

您对解决方案的选择归结为品味问题。

于 2013-02-19T14:09:51.690 回答