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__方法。这将影响您printmyBase对象上使用时显示的内容。但是,要做到这一点,您必须在实例化时传入所需的名称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 回答