2017-02-09 9 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

Создается объект имени «a» класса «waittill» вместо создания объекта. Я неявно ссылаюсь на то, что a = загружен. @DanielRoseman. –

ответ

1

Я вижу ваш случай, но имеет смысл сделать это наоборот: укажите имя переменной hardcoded, так как вы будете ссылаться на него, и используйте информацию о папке и sufix, чтобы получить имя файла изображения.

В Python, предшествующем 3.6, нет возможности автоматически угадать имя, которое оно назначено (хотя это можно сделать с помощью метаклассов), поэтому создание ваших объектов в качестве словаря и последующее заполнение вашего модуля содержимое dict может быть опцией:

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 

(Примечание другого источника неподходящей для отладки проблемы в вашем коде: если вы настаиваете на использовании \ в качестве разделителя путей, вы должны префикс строк, содержащих пути с 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»), загружен = waittill («loaded.png»), firstname = waittill (firstname.png) i хочу сделать, обновив список, я не заинтересован в доступе к объекту как таковому, но назвал объекты и передал экземпляр класса. –

+0

Вы ошибаетесь 'k.split ('.')', для 'strip'. – jsbueno

+0

@jsbueno - спасибо. Я должен был скопировать из моей подсказки python, где я ее протестировал :) –