Python:更改类实例名称 - 通过函数创建类实例

时间:2018-04-24 07:45:31

标签: python

我有一个类,我想通过函数创建实例,但我也希望能够使用Tkinter.Entry小部件的值命名实例。

我想要实现的简化版本如下:

class vtdiagram():
    IO=0.0
    IC=0.0
    EO=0.0
    EC=0.0
    IGA=0.0
    def printvtvalues(self):
        print self.IO
        print self.IC
        print self.EO
        print self.EC
        print self.IGA

def createvtinstance():
    global Nametemp
    Nametemp=vtdiagram()

如果我运行此代码,那么我可以调用Nametemp.printvtvalues()并打印所有值,因此它可以正常工作。

我现在正在尝试将实例Nametemp的名称更改为Tkinter条目小部件上的字符串。基本上,如果我在createvtinstance()时在输入框上写入engine1,我想通过以下方式调用实例:

engine1.printvtvalues()

并获取值。

我想这个函数应该是这样的:

def createvtinstance():
    global Nametemp
    Nametemp=vtdiagram()
    Nametemp._command_to_change_the_name_=stringinentrybox.get()

你们有没有知道可以做这样事情的命令? 或者有没有办法可以达到相同的效果,也许使用字典?

***编辑:我需要为变量命名的原因如下(简单英语):我正在创建一个'引擎模拟器'。 这个想法是用户将在GUI中输入引擎参数-plus其名称,这是vtdiagram类。 使用课程的原因是我具有' engine1,engine2 ...'保存为类的实例,但我还需要附加功能。这是因为我想生成已保存引擎的图形和图表,但仅在调用时生成。所以我可以比较engine1和engine2,但是然后忘记'来自GUI的engine2比较1和3.

请记住我对python很新:) ***

非常感谢!

1 个答案:

答案 0 :(得分:-2)

我不建议根据用户输入更改变量的名称。 你可以实现同样的效果"像这样:

Objects=[]
Names=[]
def createvtinstance(Object=4,Name="engine1"):
    global Nametemp
    global Objects
    global Names
    Nametemp=Object # I'll just use an int to demonstrate.
    Objects+=[Nametemp]
    Names+=[Name]
def Use(Name="engine1"):print(Objects[Names.index(Name)]) # Or: Objects[Names.index(Name)].SomeFunction()

如果您真的想要根据用户输入更改变量的名称,那么您可以这样做:

def createvtinstance(Name="engine1"):
    if (not Name[0]in"qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM") or False in(i in"1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"for i in Name) or Name in("tkinter","createvtinstance","Name","vtdiagram",):return "Invalid name." # This should make the code more "robust".
    try:exec("global "+Name+"\n"+Name+"=vtdiagram()")
    except SyntaxError:return "Invalid name."

或者这个:

def createvtinstance(Name="engine1"):
    if (not Name[0]in"qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM") or False in(i in"1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"for i in Name) or Name in("tkinter","createvtinstance","Name","vtdiagram",):raise NameError("The name "+Name+" does not comply to validation rules.") # This should make the code more "robust".
    try:exec("global "+Name+"\n"+Name+"=vtdiagram()")
    except SyntaxError:raise NameError(Name+" is a reserved keyword.")

顶部示例显示了如何使用列表查找另一个列表中的对象;使用字符串。这就是我在这种情况下可能会做的事情,但字典可能更好。

底部示例显示了如何根据用户输入实际命名变量。这是 NOT WOMMENDED 。每个人似乎都同意使用exec会适得其反,应该避免。 Python无法在exec语句中编译代码直到执行,并且无法对代码进行颜色编码。

人们一直在建议使用python词典,所以我决定研究它们。字典(dict)似乎是一种类似于列表的数据类型,除了它们可以使用字符串(或其他"不可变"数据类型)编制索引。这是我的第一个使用字典而不是列表的示例:

Objects={}
def createvtinstance(Object=4,Name="engine1"):
    global Objects
    Objects[Name]=Object
def Use(Name="engine1"):print(Objects[Name]) # Or: Objects[Name].SomeFunction()

Python似乎有一个名为globals的内置字典,它存储了所有变量,所以你可能会这样做:

def createvtinstance(Object=4,Name="engine1"):
    globals()[Name]=Object # Or globals()[Name]=vtdiagram()

但是,如果用户使用createvtinstancetkinter等名称,则会允许用户中断您的计划。