Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用/执行列表中的字符串作为对象名(python)_Python_List_Object - Fatal编程技术网

使用/执行列表中的字符串作为对象名(python)

使用/执行列表中的字符串作为对象名(python),python,list,object,Python,List,Object,看起来是这样的: class Boy(): def __init__(self): self.age = input() self.height = input() boys = [input(), input()] # this is probably a bad idea b = {} for boy in boys: b[boy] = Boy() 我定义了一个类: clas

看起来是这样的:

    class Boy():
        def __init__(self):
            self.age = input()
            self.height = input()

    boys = [input(), input()] # this is probably a bad idea

    b = {}
    for boy in boys:
        b[boy] = Boy()
我定义了一个类:

class Boy():
    def __init__(self):
        self.age    = input()
        self.height = input()
然后,我定义了一个包含男孩名字的列表,我希望这些男孩成为上述“类男孩”的对象实例:

boys = [input(), input()]
for value in boys:
    value = Boy()
(例如:john&frank,因此男孩=['john','frank'])

现在,我想迭代我的列表“boys”,并使用每个名称创建“class Boy”的对象:

boys = [input(), input()]
for value in boys:
    value = Boy()
当然,它不起作用:-)但有没有办法实现它?? 如果这个问题听起来很傻的话,我已经使用Python一周了:-) 如果有人能帮助我,我将非常感激

感谢大家的帮助,我实施了建议的解决方案:

thank_you_people = ['Makoto','L3viathan','Rcynic','Pythonic','Paul Rooney', 'st.eve']
:-)


我强烈建议您稍微修改一下类,以从构造函数中删除
input()
调用。您可以使用
\uuuu init\uuuu
方法,该方法具有年龄和身高的可选参数,以及名称的强制参数:

class Boy():
    def __init__(self, name, age=None, height=None):
        self.age    = age
        self.height = height
        self.name   = name
然后可以使用名称进行实例化,并在以后分配属性:

boys = [Boy(input("New boy: ")), Boy(input("New boy: "))] # e.g. "John", "Frank"
for boy in boys:
    boy.age = input("Age of",boy.name + "?")
    boy.height = input("Height of",boy.name + "?")
编辑:将男孩放在字典中,以便更方便地访问:

boys = {}
for _ in range(2):
    name = input("New boy:")
    boys[name] = Boy(name)
for boy in boys:
    boys[boy].age = input("Age of",boys[boy].name + "?")
    boys[boy].height = input("Height of",boys[boy].name + "?")

为了不只是将任何东西用作对象名,您可以将输入用作dict的键。类似如下:

    class Boy():
        def __init__(self):
            self.age = input()
            self.height = input()

    boys = [input(), input()] # this is probably a bad idea

    b = {}
    for boy in boys:
        b[boy] = Boy()
我建议I)创建名称包含在字符串中的变量,并且ii)将年龄和身高作为args、**kwargs或*args传递到类中,正如Makoto已经建议的那样。大致如下:

class Boy():
    def __init__(self, name, age=0, height=0):
        self.age    = age
        self.height = height

boys = ['finn', 'jake']
ages = [16, 33]
height = [165, 120]

boys_objects = {}

for i, b in enumerate(boys):
    boys_objects[b] = Boy(age=ages[i], height=heights[i]) 

不要在
\uuuu init\uuuu
方法中使用
输入
函数,因为它限制了
男孩
类的使用方式。相反,定义一个单独的函数来创建
Boy
,并将这些参数传递给
Boy
构造函数。然后,您可以将您的
男孩
存储在一个
dict
中,由男孩的名字键入

e、 g

以后你可以像这样询问一个男孩的名字

if 'paul' in boys:
    print(boys['paul'].age)
    print(boys['paul'].height)
else:
    print('no boy called paul')

如果您可以使用同名的
Boy
s,则此功能不起作用。在这种情况下,您可以让每个词典条目保存一个
男孩的
列表
,并找到一些其他参数来区分同名的
男孩。

使用zip函数。不过,您必须稍微更改类构造函数

class Boy(object):
    def __init__(self, (name, age, height)):
        self.name = name
        self.age = age
        self.height = height
然后将输入值放入列表中

names = ['a','b','c']
ages = [10, 20, 30]
heights = [155, 160, 165]
boys = zip(names, ages, heights)
for guy in boys:
    b = Boy(guy)
    print b.name, b.age, b.height
我不知道你想对这些对象做什么,但是你可以在for循环中改变它

编辑:针对OP在评论中出现的错误:

我无法重现init错误。我尝试了python和iPython。 或者你可以试试

def __init__(self, guy_tuple):
    self.name = guy_tuple[0]
    self.age = guy_tuple[1]
    self.height = guy_tuple[2]
如果这也不起作用,您可以将构造函数更改为分别输入姓名、年龄和身高。喜欢为你工作

def __init__(self, name, age, height):
    self.name = name
    ... 
那么for循环必须相应地改变。由于guy是一个包含所有三个元素的元组,因此必须通过元组中的索引获取每个元素

for guy in boys:
    b = Boy(guy[0], guy[1], guy[2])

是的,对象b将被覆盖,一旦获得对象,您必须更改它以执行您需要它执行的操作。因此,在b被实例化之后,将其传递给另一个函数,以便对其执行所需的操作,或者将其附加到列表中。一旦b是一个对象,您就可以继续使用所需的逻辑

您将需要额外的参数。您不希望在实例化时捕获
input()
;您希望在需要实例化对象之前向您提供该值。我希望在创建对象实例时手动指定这些值,这就是想法。但是我想自动给对象命名(通过循环),从名称列表中将名称输入到类中。如果我手动给对象起一个名字,它会很好地工作,例如:john=Boy(),然后我输入例如5表示年龄,100表示高度。那我就有我想要的了约翰;约翰身高=100。但是我不想手工写所有男孩的名字,我想通过一个循环自动完成。有可能吗?可能的副本我会检查它,谢谢,MakototoThank,st.eve,我试过了,它工作了,几乎100%是我想要的,根据你的建议,我可以通过键入字典的名称并在[]内提供名称来获得给定男孩的年龄或身高,例如b['john'].age将返回我在循环时提供的年龄。为了达到100%,我只想问一下,是否有什么我可以修改的,以便我得到约翰的年龄,例如,只有:john.age(我最初的想法)?即使没有,我还是非常感谢你的回答,因为这是我作为一个初学者最简单的回答:-)我现在来检查其他的:-)干杯,我想我想不出一个简单的解决方案来满足你100%的要求。但是,混合数据和代码被认为是一个非常糟糕的主意。好吧,:-),谢谢,你的回答很有帮助,顺便说一下,我假设在类定义中混合数据和代码=输入(),我需要一些时间来学习这个术语,上周我刚开始使用Python,几乎所有的东西对我来说都是新的:-)这更像是一个问题,取决于
input()
的编写位置:在作业的右侧是可以的(尽管在您的示例中不是很漂亮),左侧是不好的。在最好的情况下,您的用户可以输入与某些内部变量相同的名称,从而使您的程序崩溃。class Boy(name,age=0,height=0):生成NameError:name‘name’未定义,我猜您的意思是将它们放在init方法中:def _init _;(self,age=0,height=0)然后它工作,我用boys_对象['finn']获得finn的年龄。age。这是一个解决方案,谢谢,Pythonic。我想知道是否有可能使用列表值直接命名类的对象(没有dict),以便获得'finn'的年龄,我只需键入finn.age(如果我手动键入名称,这会起作用),因为列表中的名称是字符串,作为对象名s.th是不可接受的。与MATLAB1中的eval一样,1)更正参数传递,并进行相应编辑,2)请参阅stringsHi、Rcynic中有关命名变量的注释,我对您的建议有以下问题