2

需要一点帮助来理解我做错了什么。可能很基本,但我还没有把我的大脑包裹起来。

我的代码是这样的:

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

我应该怎么做才不会导致这个错误?

编辑:如果我将我的初始化更改为:

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

pylint 反对意见消失了,我可以看到将门户定义为基础对象的价值,因为它最终将成为一个真实对象,但将 Portal.PTF 定义为本身对我来说似乎是无稽之谈。

4

1 回答 1

4

如果您的 API 不需要客户端代码为方法提供这些属性的值(在这种情况下,您的类 API 可能缺少设置这两个属性的值的方法),推荐的 Python 方法是初始化self.Portalself.locator输入。None__init____int__

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 将能够使用它来收集有关可能的门户和定位器类型的一些知识,并且它将能够分析 和 等属性的定义PortalClassLocatorClassPTF可能检查Presence_of_Element.

旁注:我建议尝试在类、属性和方法的命名上实现一些一致性。Pylint 将为您提供帮助,您可以自定义它使用的正则表达式以匹配您使用的命名约定。

于 2012-05-14T14:36:21.987 回答