2

外部ソースからデータを抽出する必要があります。いくつかの構造を持つベースクラスを作成します。myBaseクラスのタイプであるが、ソースを反復処理する回数を自動的に説明する名前のオブジェクトが必要です。この番号を格納するクラスを作成し、必要なオブジェクトを返す呼び出しメソッドを使用します。オブジェクトの名前として文字列を使用する方法が見つかりませんが、新しいオブジェクトを作成するたびに自動的に異なります。この例のコードを簡略化しました。

class myBase:
    def __init__(self):
        iteratedValue = None

class myIterator:
    def __init__(self):
        self.k = 0
    def __call__(self, s):
        self.k += 1
        self.name = 'myData' + str(self.k)
        # create an object named myData1, myData2 ...
        self.name = myBase() 
        self.name.iteratedValue = s 
        print '%s name is %s for k = %i' % (self.name, self.name.iteratedValue, self.k)

        # return object named myData1 type of myBase
        return self.name

def DataExtraction():
    # function to extract data form external source
    data = myIterator()
    data('Alice') 
    data('Ben') 

DataExtraction()

私の出力は次のとおりです。

<__main__.myBase instance at 0x7f261b6dc6c8> name is Alice for k = 1
<__main__.myBase instance at 0x7f261b6dc6c8> name is Ben for k = 2

特定の名前のオブジェクトを返す必要があり、次の出力が期待されます。

myData1 name is Alice for k = 1
myData2 name is Ben for k = 2

元の問題ははるかに複雑です。私は外部データを持っており、それらが来るたびに、このデータからいくつかの値を抽出したいと思います。これを行うたびに、それを操作するためのオブジェクトが必要ですが、最終的には別のメソッドのdictに格納するため、異なる名前のこのオブジェクトが必要です。つまりmyData1、元のデータが変更されたときにデータを操作して結果をオブジェクトに保存します。データを再度操作して結果を保存しますmyData2。結局のところ、すべてのmyDataオブジェクトが必要であり、それらの統計を実行して変更方法を確認します。元のデータにアクセスできなくなりました。の自動命名規則が必要でmyDataあり、イテレータを表現する場合に最適です。

self.nameオブジェクトの名前の代わりに文字列を使用するにはどうすればよいですか?

4

3 に答える 3

3

ジェネレーターを使用する方が良いようです。データを読み取り(実際には、例のようにハードコーディングされています)、インデックス付きの名前で Datum オブジェクトを構築するコードの例を次に示します。

class Datum(object):
    def __init__(self, index, value):
        self.name = 'myData%d' % (index + 1)
        self.value = value

def read_data():
    yield 'Alice'
    yield 'Ben'

def enumerate_data():
    for i, value in enumerate(read_data()):
        yield Datum(i, value)

for d in enumerate_data():
    print d.name, d.value
于 2012-11-17T23:00:20.630 に答える
2

あなたはすでに でそれをやっていますself.name = 'myData' + str(self.k)。問題は、すぐに上書きすることself.name = myBase()です。あなたがそれで何をしようとしているのかはわかりませんmyBase()が、おそらく名前から分離したいと思うでしょう。 self.name文字列またはmyBaseオブジェクトのいずれかにすることができますが、両方にすることはできません。

おそらくあなたはできる:

    self.name = 'myData' + str(self.k)
    self.base= myBase() 
    self.base.iteratedValue = s 
    print '%s name is %s for k = %i' % (self.name, self.baseiteratedValue, self.k)

このようにして、名前と「ベース」の両方を別々の属性self.nameself.base.

myBaseまたは、クラスにメソッドを与えることもできます__str__printこれは、オブジェクトで使用したときに表示されるものに影響しmyBaseます。ただし、これを行うには、インスタンス化するときに目的の名前を渡す必要があります。たとえばmyBase、次のようになります。

class myBase(object):
    def __init__(self, name, iteratedValue):
        self.name = name
        iteratedValue = iteratedValue
    def __str__(self):
        return self.name

class myIterator(object):
    def __init__(self):
        self.k = 0
    def __call__(self, s):
        self.k += 1
        name = 'myData' + str(self.k)
        self.name = myBase(name, s) 
        print '%s name is %s for k = %i' % (self.name, self.name.iteratedValue, self.k)

        # return object named myData1 type of myBase
        return self.name

これらの方法 (またはおそらく他の方法) のどれがあなたが探しているものなのかわかりません。不可解なのは、オブジェクトの「名前」をmyBaseインスタンスにしているということです。オブジェクトの「名前」が何を表しているのかわかりませんが、通常、オブジェクトの名前が他のオブジェクトであるとは思いません。

ちなみに、Python 2 を使用しているようです。その場合は、クラスを で定義する必要がありますclass someClass(object)。を含めるobjectと、クラスが新しいスタイルのクラスになります。これは、基本的に常に必要なものです。

編集:あなたがしようとしているのが実際にmyData1文字列に基づいて呼び出される変数を作成することである場合、それを行うことができmyData('Alice')、その後、どういうわけか魔法のように変数myData1がそのオブジェクトを参照するようになります。答えは「それをしないでください」です。多数のオブジェクトを作成し、それらに番号またはその他のラベルによって構造化された方法でアクセスする場合は、リストまたは辞書を使用します。

于 2012-11-17T22:31:23.843 に答える
0

オブジェクトに名前を付けることを心配する必要はありませんdict

myObjects = {1:Alice(), 2:Bob()}
于 2012-11-17T22:37:42.807 に答える