在Python访问实例变量,而不是实例方法(Access to instance variable,

2019-10-29 09:17发布

我到Python新手,我想类似的问题已经被问(包括本: ?你可以使用一个字符串在Python中实例类 ),但我不明白的答案或如何应用它们。

我试图创建使用的是什么,我会在列表中所称的“实例名称”一类的多个实例。

这里是什么,我试图做一个例子:

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

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

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

有用吗? 我很困惑我不知道。

好。 这是一些丑陋的代码,但这里是我现在有:

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 "\n"

print DoSomething.instances

print "\n"

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

这里是我的输出:

0
1
2


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


foo
None


bar
None


baz
None

为什么是“名”可变印刷,但“暴躁”的方法是不是?

Answer 1:

你似乎在问“我怎么把字符串‘INST1’和创建一个名为‘INST1’变量”。

答案是,你不想这样做。 相反,创建一个字典或列表映射你的字符串有问题的对象。 见这个问题的一些例子。

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



Answer 2:

这并不是说我有什么想法,你真正要做的,以满足您的特定代码,表仅仅是值的集合。 什么你对待它喜欢的是一个字典,这是一个键和值之间的关联。

为了使您的工作例如,你可以使用的字典:

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

现在,这将允许下面的表达式成功:

instance_names.names[x] = DoSomething()

......因为names现在是一个字典,你正在访问的关键,并分配一个值。

同样,我做,我不知道这是什么代码试图做...免责声明有感觉它可能是不好的......但不采取它判断的角度。



Answer 3:

instance_names.names是一个列表 ,其需要数字作为指标。 事实上,您发布的类型错误说同样的事情。

但是,你想用一个字符串来设置元素instance_names.names[x] - ,其中x是一个字符串。 列出不允许这一点,你需要使用一个字典为。

有几种方法来解决问题:

  1. 您可以使用字典instance_names.names摆在首位。 然后,但是,你必须使用一个保留的对象,如None作为的情况下,一个占位符,还没有被创建:'self.names = {“INST1”:无,“INST2”:无,“inst3”:无} , and you must iterate through the keys of the dictionary:在instance_names.names.keys()X:`

  2. 您可以使用一个单独的字典的情况下,并设置其在环内容: self.instances = {} instance_names.instances[x] = ...

有关Python的数据类型进一步阅读,我建议深入Python 。



Answer 4:

您可以使用type来动态地创建类:

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



Answer 5:

这是什么意思or x

self.names不存在的范围,使用instance_names.names代替。



文章来源: Access to instance variable, but not instance method in Python