2017-02-09 125 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提示符複製到我測試過的地方:) –