使用/执行列表中的字符串作为对象名(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中有关命名变量的注释,我对您的建议有以下问题