2015-05-28 129 views
-2

请原谅noob问题。我不明白,有关这个“自我”的东西是:不明白“自我”错误

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:我按照惯例修正了“自我”的用法(见下面的评论/回答)。但是,我仍然不知道我应该如何去满足Python解释器。

+1

你打算“自我”是什么?你的代码根本不会创建任何对象。 – BrenBarn

+0

'self'被用作实例方法而不是函数的第一个参数。两者之间存在相当大的差异。 – IanAuld

+0

'self'不是习惯上用作函数的第一个参数。考虑花一些时间在网上提供的各种“学习python”教程之一(例如,[this](http://learnpythonthehardway.org/book/)或[this](http://www.codecademy.com)/EN /音轨/蟒蛇))。 – larsks

回答

0

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

+0

只是名称'自我'是约定。第一个论点实际上是由语言本身给出的。 – Olaf

+0

当我说'self'只在方法定义中使用时,而不是在调用方法时(因为您提到的实例是在点之前提供的),所以我认为我在最后一句中说得很清楚。 – train1855

+0

你可能会想到,但实际上并没有。这些是不同的方面:呼叫和被呼叫。此外,这是错误的:当然是传递给方法的对象(注意不同之处:我不称它为“self”):作为** first **参数;在对象内部,它可以被第一个参数的名称引用。而_that_(这个名称,不是这样的论点)会是“自我” - 按照惯例,我试图在我的答案中详细说明这一点,如果还不清楚,欢迎留言。 – Olaf

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)。

虽然this隐式传递给C++中的某个方法,但Python要求将其作为第一个参数明确列出。 self这个名称实际上只是惯例,一个方法总是将它的对象作为第一个参数,所以它也可以被命名为“thats_me”。然而,坚持'自我',因为许多工具依赖于此(语法高亮编辑器,调试器,...)。

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

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

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