python通过变量引用对象名来创建对象,从lis创建对象

2024-03-29 00:53:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图实现下面这个重复的代码块,方法是用从列表中获取的名称创建对象,而不是重复创建对象和传递实例。在

class waittill:
    def __init__(self,path):
        self.imagepath = os.path.join("C:\python\python_projects\pyautogui\images", path)




loaded=waittill("loaded.png")
agree=waittill("agree.png")
firstname=waittill("firstname.png")            #This works absolutely fine
loginid=waittill("loginid.png")                #I wish repetition could be avoided
password=waittill("password.png")
loginbutton=waittill("loginbutton.png")
customerlist=waittill("customerlist.png")
loginpage=waittill("loginpage.png")
customerinfo=waittill("customerinfo.png")
profile=waittill("profile.png")                      

有没有可能编写一个更优雅的代码,比如在列表中循环创建对象

^{pr2}$

Tags: path代码self列表pngpasswordfirstname创建对象
2条回答

我明白你的情况,但换一种方法是有意义的:将变量名硬编码,因为你将引用它,并使用文件夹和sufix信息来获取图像文件名。在

在3.6之前的Python中,项目也无法自动猜出它所分配的名称(尽管可以用元类完成),因此将对象创建为字典,然后用dict内容填充模块可能是一个选项:

names=['loaded','agree','firstname','loginid','password','loginbutton','logout','middlename','lastname','submit','customerlist','loginpage','customerinfo','profile']

class waittill:
    def __init__(self, name):
        self.imagepath = os.path.join(r"C:\python\python_projects\pyautogui\images\{}.png".format(name))

objects = {name:waittill(name) for name in names}

for name, obj in objects.items():
    globals()[name] = obj

(请注意代码中另一个难以调试的问题:如果坚持使用\作为路径分隔符,则应在包含路径的字符串前面加上r"-否则,如果文件夹以n、t和其他字母开头,则路径将失败。在

另外,我使用globals()在模块名称空间中自动设置名称,但这不是一个好的实践。您可以使用一个类作为名称空间来完全相同-在这种情况下,只需将上面的代码放在一个类主体中(而不是在方法内部),并使用locals()而不是{}

^{2}$

字典理解有助于:

images=["loaded.png","agree.png","firstname.png","loginid.png","password.png","loginbutton.png","logout.png","middlename.png","lastname.png","submit.png",\
   "customerlist.png","loginpage.png","customerinfo.png","profile.png"]

image_objects = {k.split('.')[0]: waittill(k) for k in images}

要访问特定对象,请说“agree”,只需为image_objects字典编制索引,如下所示:

^{2}$

相关问题 更多 >