关于string:访问实例变量,但不访问Python中的实例方法

Access to instance variable, but not instance method in Python

我是Python的新手,我认为有人问过类似的问题(包括这个问题:你能用字符串来实例化Python中的类吗?)但是我不明白答案或者如何应用它们。

我正在尝试使用列表中的"实例名称"创建一个类的多个实例。

下面是我要做的一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class InstanceNames():
    def __init__(self):
        self.names = ['inst1', 'inst2', 'inst3']

class DoSomething():
    instances = []
    def __init__(self):
        DoSomething.instances.append(self)

instance_names = InstanceNames()
for x in range(len(instance_names.names)):
    print x
    # following line not working at creating instances of DoSomething
    instance_names.names[x] = DoSomething()

print DoSomething.instances

我更改了循环的列表,现在得到了以下输出:

1
2
3
4
0
1
2
[<__main__.DoSomething instance at 0x10cedc3f8>, <__main__.DoSomething instance at 0x10cedc440>, <__main__.DoSomething instance at 0x10cedc488>]

它起作用了吗?我很困惑,我不确定。

好啊。这是一些难看的代码,但我现在有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class InstanceNames():
    def __init__(self):
        self.i_names = {'inst1': None, 'inst2': None, 'inst3': None}
        self.o_names = ['foo', 'bar', 'baz']

class DoSomething():
    instances = []
    def __init__(self, blah_blah):
        DoSomething.instances.append(self)
        self.name = blah_blah

    def testy(self, a):
        a = a * 2

instance_names = InstanceNames()

for x in range(len(instance_names.i_names)):
    print x
    instance_names.i_names[x] = DoSomething(instance_names.o_names[x])

print"
"


print DoSomething.instances

print"
"


for y in DoSomething.instances:
    print y.name
    print y.testy(4)
    print"
"

以下是我的输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
0
1
2


[<__main__.DoSomething instance at 0x10dc6c560>, <__main__.DoSomething instance at 0x10dc6c5a8>, <__main__.DoSomething instance at 0x10dc6c5f0>]


foo
None


bar
None


baz
None

为什么"name"变量正在打印,而"testy"方法不是?


可以使用type动态创建类:

1
2
3
4
5
6
7
type_names = ["Class1","Class2","Class3"]
storage = {}
for t in type_names:
    storage[t] = type(t, (object, ), {"your":"instance","attributes":"here"})

for type_name in storage:
    print type_name,"=>", storage[type_name]

或者,如果您真正需要的只是一堆属性,那么可以使用collections.namedtuple生成轻量级类。

您当前拥有的是创建三个DoSomething类实例,并将InstanceNames类'names属性中的字符串值(您不使用)替换为这三个DoSomething实例。


instance_names.names是一个需要数字作为索引的列表。事实上,你发布的类型错误也说明了同样的事情。

但是,您希望使用instance_names.names[x]中的字符串设置元素,其中x是字符串。列表不允许这样做,您需要使用字典。

有几种方法可以解决您的问题:

  • 您可以首先使用字典,例如"name.names"。但是,您必须使用保留对象(如None作为尚未创建的实例的占位符:''self.names='inst1':none,'inst2':none,'inst3':none , and you must iterate through the keys of the dictionary:作为实例_names.names.keys()中x的占位符:`

  • 您可以为实例使用单独的字典,并在循环中设置其内容:self.instances = {}instance_names.instances[x] = ...

  • 为了进一步了解python的数据类型,我建议深入了解python。


    我不知道您真正想做什么,为了解决您的特定代码,列表只是一个值的集合。您对待它的方式是听写,它是键和值之间的关联。

    为了使您的示例有效,您将使用dict:

    1
    2
    3
    class InstanceNames():
        def __init__(self):
            self.names = {'inst1': None, 'inst2': None, 'inst3': None}

    这将允许以下表达式成功:

    1
    instance_names.names[x] = DoSomething()

    …因为names现在是一个dict,您正在访问一个键并为它赋值。

    再次声明,我不知道这段代码在做什么…感觉可能不好…但不是从判断的角度。


    您似乎在问"我如何获取字符串'inst1'并生成一个名为'inst1'的变量"。

    答案是你不想这样做。相反,创建一个字典或列表,将字符串映射到相关对象。有关一些示例,请参阅此问题。

    (如果这不是你要问的,请澄清你的问题。)


    这是什么意思,or x

    范围内不存在self.names,改用instance_names.names