2017-02-09 163 views
0

我试图通过创建名称从列表中获取名称而不是创建对象和重复传递实例的对象来实现此重复块代码。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")      

是有可能写出一个更优雅的代码,例如通过列表循环创建对象

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*. 
+3

我不知道你的问题是什么。你写的代码有什么问题? –

+5

使用字典 – BlackBear

+0

类“waittill”的名称“a”的对象正在创建,而不是创建对象,我隐式引用了一个ie a = loaded @DanielRoseman –

回答

1

我看到你的情况,但是有意义的做法是:将变量名称硬编码,因为你会引用它,并使用文件夹和sufix信息来获取图像文件名。

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

names = ['loaded','agree','firstname','loginid','password','loginbutton','logout','middlename','lastname' ,“提交”,“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 

(注:难以调试代码中的问题的另一个根源:如果您在使用坚持作为路径分隔符,您应该在字符串containsig路径前加上r" - 否则如果您的文件夹以n,t等字母开头,则路径将失败。

此外,我使用globals()自动在模块名称空间中设置名称,但这不是一个好习惯。你可以使用一个类作为命名空间的完全一样 - 在这种情况下,只要把上面的代码在类体(未在方法内部)内,并使用locals()代替globals()

class images(object): 
    for name in names: 
     locals(name) = waittill(name) 
0

字典的理解能帮助您:

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'] 
+0

看到,而不是通过手动创建对象和传递类实例的枯燥过程,如同意= waittill(“agree.png”),loaded = waittill(“loaded.png”),firstname = waittill(firstname.png)我想通过更新列表完成我没有兴趣访问对象本身,但命名对象并传递类实例 –

+0

您错误地将'k.split'('。')'换成'strip'。 – jsbueno

+0

@jsbueno - 谢谢。我应该从我的python提示符复制到我测试过的地方:) –