不理解" self"错误

时间:2015-05-28 01:10:31

标签: python function selenium

请原谅noob问题。我不明白这个" self"与此有关的东西:

from selenium.common.exceptions import NoSuchElementException

def is_element_present(self, how, what):
    try:
        self.driver.find_element(by=how, value=what)
    except NoSuchElementException:
        return False
    return True

#### navigate to the web page with a bunch of code here, then continue

text_present = self.assertTrue(self.is_element_present(By.LINK_TEXT, "Click Here"))

当我运行这个时,我得到的错误是:

        test_link = self.assertTrue(self.is_element_present(By.LINK_TEXT, "Click Here"))
NameError: name 'self' is not defined

我理解"自我"常规使用它作为函数中的第一个参数,但我不理解错误。我如何定义自我?

编辑1:我已经纠正了" self"按惯例使用(见下面的评论/答案)。但是,我仍然不知道我应该做些什么来满足Python解释器。

2 个答案:

答案 0 :(得分:0)

self"常规用作第一个参数"在方法中,它与一个类相关联。此上下文中的self表示调用该方法的类的实例。但是,函数不与类关联,因此不需要初始self参数。这是函数和方法之间的根本区别之一 - 方法与类相关联,并被称为instanceOfClass.methodName(args),其中函数只存在于命名空间中,并被称为functionName(args)。另请注意,当调用方法时,self不会传递给调用:它仅在定义方法时使用。

答案 1 :(得分:0)

您可能知道C ++中的this指针。在原则上,Python的self非常相似(但更多的是引用而不是指针)。它是您应用函数的当前对象。

class MyClass:
    def my_method(self, arg):
        pass

my_object = MyClass()
my_object.my__method("whatever")

实际上就像(不完全相同):

def my_func(the_object, arg):
    pass

class MyClass:
    pass

my_object = MyClass()
my_func(my_object, "whatever")

由于实际上涉及的更多,反过来的方法不起作用:

my_object.my_func("whatever")

会引发异常(错误),试试吧。这是因为my_func未绑定函数(与任何对象/类无关)。 my_method实际上是bound(到my_object)。

虽然{C}中的方法隐式传递this(您不必将其指定为参数),但Python要求将其明确列为第一个参数。名称self实际上只是约定,方法总是将其对象作为第一个参数,因此它也可以命名为" thats_me"。但是,坚持使用'self',因为许多工具都依赖于此(语法高亮显示编辑器,调试器......)。

在方法本身中,然后self.my_memberself显式访问该对象的所有成员.my_func(). While in C++ one would write my_member or this-> my_member`等等。后者基本上类似于Python的方式。

请阅读更多here和一般的教程。

背景:将第一个参数传递给对象是由于Pythons的主要指导原则之一:"显式优于隐式"。