3

私がやろうとしていることを完全に扱っていない多くの記事に出くわしました。これが重複した質問ではないことを願っています。

PCの外部にあるいくつかの実世界のオブジェクトとインターフェイスするPythonスクリプトを書いています。これらのオブジェクトとのインターフェースに必要な関数を含むクラスを作成しました。また、これらのクラスのインスタンスをインスタンス化し、それらからデータを取得し、すべてをCSVファイルに保存する、オブジェクト指向ではない関数を正常に作成しました。それはすべてうまくいきます。私がつまずくのは、関数をより適応性のあるものにして、別のクラスインスタンスを追加したり、既存のインスタンスから別のデータポイントを取得したりするたびに関数を書き直す必要がないようにすることです。

私が試みているアプローチは、クラスインスタンスの名前と、それらのインスタンスからデータを取得するための特定の関数名を含むリストを作成することです。次に、このリストを別の関数に渡します。この他の関数は、理想的には、CSVファイルのヘッダーを作成して(データをより簡単に解釈できるようにするため)、データの収集に進みます。

擬似コード:

inst1 = my_class_1()
inst2 = my_class_2()
filename = 'fubar.csv'
control_list = ['inst1', 'value1', 'inst2', 'value']

my_fucntion(filename, control_list):
# Code to create a header for CSV file in the form inst1-value1, inst2-value2
# Loop to control the number of times to grab data
    # Code which iterates control_list and builds up things like inst1.value1(), inst2.value2(),
    # etc. and then appends the results to a list
    # write results list to filename

control_listのすべての要素を文字列として関数に渡すと、結果ファイルのヘッダーを簡単に生成できますがinst1.value1()、Pythonがクラス内の関数にアクセスできるように、これらの文字列を取得して次のようなものを生成する方法がわかりません。クラスからデータを取得できるよう[inst1.value1(), inst2.value2()]にリストを作成すると、この方法でヘッダーファイルを作成する方法がわかりません。

上で概説したアプローチが機能しない場合、私は他のアプローチを受け入れます。

4

3 に答える 3

2

この作業は、他の Python 定義済み関数を使用せずに、おっとの概念を利用して簡単に実行できます。

class MyClass(object): def init (self, value1): self.value1 = value1

inst = MyClass("例")

属性 inst.value1 の値を取得します

属性 inst.value1 = "hello" の値を設定します

于 2012-10-05T11:28:19.383 に答える
1

関数を探していると思いますgetattr

class MyClass(object):
    def __init__(self, value1):
        self.value1 = value1

instance = MyClass("example")
fieldname = "value1"
fieldvalue = getattr(inst1, fieldname)
# fieldvalue == "example"

getattrとを使用するとsetattr、名前をパラメーターとして関数に渡すフィールドを操作するコードを記述できます。

于 2012-10-04T19:33:26.347 に答える
0

最近、同様の問題があり、以前はnamedtupleそれを解決していました。

value1 = 'value of 1'
value2 = 'value of 2'
ControlList = namedtuple("ControlList", "inst1, inst2"))
controllist = ControlList(value1, value2)

>>> print controllist.inst1
... 'value of 1'
>>> print controllist.inst2
... 'value of 2'

value1 と value2 は文字列である必要はなく、インスタンス化されたクラスまたはインスタンス化されていないクラスであってもかまいません。

ControlList をこのように記述する利点は、いつでもコントロール リストを拡張できることです。また、ControlList が特定の長さであること、または特定の場所に特定の値があることに依存する関数を壊すことはありません。.method バインディングを介して ControlList 内のアイテムに常にアクセスできControlList.method、コードの混乱を避けたい場合は、内部的に関数にエイリアスを設定できます。

于 2012-10-04T19:25:35.817 に答える