我对 Python(和 stackoverflow)还很陌生,我需要一些帮助。我有如下 2 门类(class)
class baseClass(object):
def __init__(self):
self.attribute = None
def baseMethod(self):
return 'xxx' + str(self.attribute)
class classA(baseClass):
field = "test"
def __init__(self):
self.attribute = "attribute value"
我想做如下的事情:
objectA = classA()
afterBaseMethod = objectA.baseMethod()
afterBaseMethod.field
但是我收到错误消息 AttributeError:“str”对象没有属性“field”
事实上,我希望 baseMethod() 返回类型 objectA (所以我的子类类型)。 我如何更改我的类定义来实现这一目标?
对不起,大家,我不够精确我想做的事情。事实上,我想在 python 中实现页面对象以进行 webdriver 测试。我的代码如下。
from selenium import webdriver
########## classes definitions
class BasePageObject:
def __init__(self, driver):
self.locator = None
self.driver = driver
def getByLocator(self):
return self.driver.find_element_by_css_selector(self.locator)
class MainPage(BasePageObject):
def __init__(self, driver):
self.driver = driver
def getHeader(self):
# I expect here to receive HeaderPageObject, not WebElement (as returned by getByLocator())
return HeaderPageObject(self.driver).getByLocator()
class HeaderPageObject(BasePageObject):
def __init__(self, driver):
self.driver = driver
self.locator = '#header'
def doSomethingWithHeader(self):
pass
###########################
driver = webdriver.Firefox()
driver.get("https://www.linkedin.com")
mainPage = MainPage(driver)
header = mainPage.getHeader()
header.doSomethingWithHeader()
当我运行它时,我得到了 header.doSomethingWithHeader() AttributeError:“WebElement”对象没有属性“doSomethingWithHeader”
最佳答案
您发布的代码只是定义了两个类,这意味着您甚至没有告诉我们这个报告的错误发生在哪里或者您做了什么来引发它。但 Python 的类机制可以很好地胜任这项任务。
对象知道它们是什么类型,因此即使方法是从父类(super class)继承的,它也会在子类实例上运行(即 self
将是子类的实例)。下面是一些要演示的代码 - 两个类,每个类都使用基类来报告其类型:
class baseClass(object):
def baseMethod(self):
return type(self)
class classA(baseClass):
pass
b = baseClass()
print b.baseMethod()
a = classA()
print a.baseMethod()
输出
<class '__main__.baseClass'>
<class '__main__.classA'>
您可以看到 classA
对象正确打印出其类型,因此它知道进行调用的对象类型。我希望这能告诉您需要了解的内容。
关于Python,selenium webdriver - 我需要基类方法来返回其子类的类型。如何实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22120589/