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

2024-10-01 17:41:40 发布

您现在位置: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 entry小部件上的字符串。基本上,如果在我createvtinstance()时在输入框中写入了engine1,那么我希望通过以下方式调用实例:

^{pr2}$

然后得到数值。在

我想函数应该是这样的:

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

你们知道指挥部能做这种事吗? 或者有什么方法可以让我达到同样的效果,也许用字典?在

***编辑:我需要命名变量的原因是为了以下(用简单的英语):我正在创建一个“引擎模拟器”。 其思想是用户将在GUI中输入引擎参数-加上其名称-这就是vtdiagram类。 使用类的原因是我将'engine1,engine2…'的特性保存为类的一个实例,但是我还需要附加一些函数。这是因为我想生成保存的引擎的图形和图表,但只有在调用时才会生成。所以我可以比较engine1和engine2,但是从GUI中得到“forget”engine2来比较1和3。在

请记住,我对python很陌生:)***

非常感谢!在

胡安


Tags: 实例函数io引擎self部件tkinterdef
1条回答
网友
1楼 · 发布于 2024-10-01 17:41:40

我不建议根据用户输入更改变量的名称。 你可以这样“达到同样的效果”:

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()

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

^{pr2}$

或者这个:

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.")

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

下面的示例显示了如何根据用户输入实际命名变量。不建议这样做。似乎每个人都同意使用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之类的名称,这将允许用户中断您的程序。在

相关问题 更多 >

    热门问题