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

議論に変えることもできますし、せずに仕事に変えることもできますがdeltas、どちらも多くの手直しが必要であり、両方の機能を書いた上司と一緒に整理する必要があります(彼にはこの問題はありません)。parbuckets_from_pairspar

そのため、呼び出し元の関数で新しいクラスを作成するよりも、「ドット」を使用して何かを参照できるオブジェクトを作成する簡単な方法があることを期待していました。

4

5 に答える 5

4
from collections import namedtuple
value = namedtuple('Value', 'N')(len(roots["roots"]))
于 2013-02-19T13:57:58.743 に答える
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 に答える
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

値を変更可能にする必要がある場合。Python3.3以降でtypes.SimpleNamespaceクラスを使用できます。

from types import SimpleNamespace

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

古いPythonバージョンでは、 Adapterクラスを使用できます。

読み取り専用の場合。を使用できます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 に答える