2012-05-14 37 views
2

需要一些幫助來理解我做錯了什麼。可能很基本,但我沒有把我的大腦包裹在它周圍。Python/pylint E1101需要關於正確對象定義的幫助

我的代碼是這樣的:

class baseElement(object): 
    def __init__(self): 
     self.Portal = '' 
     self.locator = '' 

    def present(self): 
     return self.Portal.PTF.Presence_of_Element(self.locator)  

    def visible(self): 
     return self.Portal.PTF.Is_Element_Visible(self.locator)  

class baseActiveElement(baseElement): 
    def hover(self): 
     self.Portal.PTF.Mouse_over_element(self.locator) 

    def click(self): 
     self.Portal.PTF.Click_on_Element(self.locator) 

    def get(self): 
     return self.locator 

我定義的門戶網站,當我從實例這些基地的對象,它包含了一些函數來執行特定的操作。這工作。那裏沒有問題。

但pylint的抱怨正是如此:

E1101: 8,15:baseElement.present: Instance of 'str' has no 'PTF' member 
E1101: 11,15:baseElement.visible: Instance of 'str' has no 'PTF' member 
E1101: 15,8:baseActiveElement.hover: Instance of 'str' has no 'PTF' member 
E1101: 18,8:baseActiveElement.click: Instance of 'str' has no 'PTF' member 

我應該怎麼做才能不引起這個錯誤?

編輯: 如果我改變我的init這樣:

class baseElement(object): 
def __init__(self): 
    self.Portal = object 
    self.Portal.PTF = self.Portal.PTF 
    self.locator = '' 

的pylint的異議消失了,我可以看到定義門戶爲基本對象的價值,因爲它最終會成爲一個真正的對象,但將Portal.PTF定義爲本身對我來說看起來是無稽之談。

+2

如果您不想要空字符串,請不要將'self.Portal'初始化爲空字符串。 – geoffspear

+0

什麼是PTF屬性? – Brady

+0

Wooble,我將它初始化爲空字符串,因爲在編譯時沒有門戶對象,只有在運行時。而且pylint會拋出E1101,如果沒有它,不會找到「Portal」。什麼會是一個更好的方法來創建一個虛擬? –

回答

4

推薦蟒蛇的方法是在__init__初始化self.Portalself.locatorNone,如果你的API不需要客戶端代碼爲這些屬性的__int__方法提供值(在這種情況下,你的類API可能是缺乏一種方法設置這兩個屬性的值)。 Pylint試圖做類型推斷:如果self.Portal的唯一情感是它可以在你的代碼中看到一個字符串,它會推斷出該屬性的類型是str,並使用它來檢查對其執行的調用self.Portal。

如果你寫:

class baseElement(object): 
    def __init__(self, portal, locator): 
     self.Portal = portal 
     self.locator = locator 

它將嘗試知道它一無所知門戶網站和定位器的類型。

如果在同一模塊的代碼有如:

from somewhere import PortalClass, LocatorClass 
# [...] 
element = SomeClassDerivingFromBaseElement(PortalClass(), LocatorClass()) 

然後pylint的就可以用它來收集有關可能的類型門戶網站和定位有一定的瞭解,這將是能夠分析PortalClassLocatorClass的定義爲PTF等屬性,並可能檢查Presence_of_Element的原型。

旁註:我建議嘗試在類,屬性和方法的命名上達到一致性。 Pylint會幫助你,你可以自定義它用來匹配你使用的命名約定的正則表達式。

+0

啊,太棒了,應該讓我朝着正確的方向發展。 –