问题描述
我正在尝试通过创建名称从列表中提取的对象来实现下面的此重复代码块,而不是创建对象并反复传递实例。
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")
是否可以编写更优雅的代码,例如循环遍历列表以创建对象
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"]
for each_image in images:
a,b=each_image.split(".")
b=(a+"."+b)
image=b.strip()
name=a.strip()
name=waittill(image) #this is where the problem lies, its repeatedly naming the object *name* and not say *loaded* or *agree*.
1楼
我看到了您的情况,但是反过来还是有道理的:对变量名进行硬编码(因为您将要引用它),并使用文件夹和sufix信息获取图像文件名。
在3.6之前的Python中,对象也无法自动猜测它的名称(尽管可以用元类完成),因此将对象创建为字典,然后用dict内容填充模块可以选择:
名称= ['已加载','同意','名字','loginid','密码','loginbutton','logout','middlename','lastname','submit','customerlist','loginpage' ,“ customerinfo”,“个人资料”]
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
(请注意代码中另一个难以调试的问题的来源:如果坚持使用\\
作为路径分隔符,则应在字符串containig路径前加上r"
前缀-否则,如果文件夹以某些字母开头,则路径将失败像n,t和其他
另外,我正在使用globals()
在模块名称空间中自动设置名称,但这不是一个好习惯。
您可以将类用作命名空间,使其完全相同-在这种情况下,只需将上面的代码放在类主体(而不是方法内部)中,然后使用locals()
而不是globals()
class images(object):
for name in names:
locals(name) = waittill(name)
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}
要访问特定的对象说“同意”,只需像这样索引image_objects字典:
agree = image_objects['agree']