Python 分配一个对象';s的名字取自表达式

Python 分配一个对象';s的名字取自表达式,python,Python,我需要从外部源提取数据。我构建了一个具有某种结构的基本类。我需要myBase类类型的对象,但其名称会自动描述我在源代码上迭代的次数。我构建了一个存储这个数字的类,并使用一个call方法返回我需要的对象。我找不到一种方法将字符串作为对象的名称,但每次构建新对象时,字符串都会自动不同。 我简化了此示例的代码: class myBase: def __init__(self): iteratedValue = None class myIterator: def __

我需要从外部源提取数据。我构建了一个具有某种结构的基本类。我需要myBase类类型的对象,但其名称会自动描述我在源代码上迭代的次数。我构建了一个存储这个数字的类,并使用一个call方法返回我需要的对象。我找不到一种方法将字符串作为对象的名称,但每次构建新对象时,字符串都会自动不同。 我简化了此示例的代码:

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

原来的问题要复杂得多。我有外部数据,每次它们出现时,我都想从这些数据中提取一些值。每次我这样做时,我都需要一个对象来处理它,但我需要这个对象有不同的名称,因为最后我将它们存储在dict中,以供其他方法使用。换句话说,我处理数据并将结果存储在对象
myData1
中,当原始数据发生更改时,我再次处理数据并将结果存储在
myData2
中。毕竟,我需要所有
myData
对象,并对其进行统计,以查看更改的方式。我再也不能访问原始数据了。我需要
myData
的自动名称约定,如果它将表示迭代器,则需要最佳名称约定


如何用字符串代替对象的名称
self.name

您已经在使用
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)
这样,您可以将名称和“base”作为单独的属性
self.name
self.base

或者,您可以给出
myBase
class a
\uuu str\uu
方法。这将影响在
myBase
对象上使用
print
时显示的内容。但是,要做到这一点,您必须在实例化
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
实例。我不确定对象的“名称”要表示什么,但我通常不会期望对象的名称是其他对象

顺便说一句,看起来您正在使用Python2,在这种情况下,您应该使用
classsomeclass(object)
定义类。包含
对象
使您的类成为新样式的类,这基本上是您一直想要的


编辑:如果您试图根据字符串创建一个名为
myData1
的变量,那么您可以执行
myData('Alice')
,然后神奇地让变量
myData1
引用该对象,答案是“不要这样做”如果您想创建一组对象,并通过数字或其他标签以结构化方式访问它们,请使用列表或字典。

为什么要担心命名对象,为什么不将它们放在
目录中

myObjects = {1:Alice(), 2:Bob()}

看来你最好使用发电机。下面是一些示例代码,它读取数据(实际上它是硬编码的,就像在您的示例中一样),然后用索引名称构造数据对象

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

谢谢@BrenBarn我知道我超越了,我想展示我的尝试。我需要一个对象
myData1
类型的
myBase
myData2
类型的
myBase
。问题是我不知道如何获取所需的名称并将其分配给对象。我希望在下一次调用
myData2=myBase('Ben')
后,从
call
方法将其作为
myData1=myBase('Alice')
返回。这个例子很简单,在每次迭代中,我的对象中都有大量数据。@Mus:我仍然不确定您要做什么,但看到了我编辑过的答案。如果您试图以编程方式创建具有特定名称的变量,那么您不能也不应该这样做。而是使用字典或列表来访问对象。如果这不是你的意思,你需要给出一个具体的例子,说明你试图做什么以及它是如何失败的。@BrenBarn,你错了。你可以用某些名称创建变量
globals
locals
,但是你不应该这样说是对的。注意:如果你使用的是属性,请确保你的类派生(object).原来的问题要复杂得多。我有外部数据,每次它们出现时,我都想从这些数据中提取一些值。每次我这样做时,我都需要一个对象来处理它,但我需要这个对象具有不同的名称,因为最后我将它们存储在另一个方法的
dict
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