猿问

NameError: name 'self' is not defined 解释

我试图了解“自我”是如何工作的。在第一个代码中,我得到了错误,但我相信我做的一切都是正确的。在那之后,我尝试了更多的东西来解决它,但不能。我在这里想念什么?


class myClass:

    def foo(self):

            print('WORKED')

    self.foo()

NameError:名称“自我”未定义


class myClass:

    def foo(self):

            print('WORKED')

    foo()

类型错误:foo() 缺少 1 个必需的位置参数:'self'


   class myClass:

       def foo():

               print('WORKED')

       foo()

   myClass.foo() 

工作过


摇曳的蔷薇
浏览 1023回答 3
3回答

繁星点点滴滴

正确的用法是:class MyClass:    def foo(self):        print('WORKED')    def bar(self):        self.foo()obj = MyClass()obj.bar()您必须使用参数定义方法self。它会像obj调用时一样自动传递obj.foo()。即,obj.foo()等价于MyClass.foo(obj)。

慕莱坞森

为什么?class myClass:    def foo(s):        print('WORKED', s)        return s    s = foo(1)    print("Hello")myClass.foo(2) print(myClass.s)结果:WORKED 1HelloWORKED 21因此,如果您在foo()没有self它的情况下调用将被视为一个类字段。如果您省略了字段声明(即直接) s = foo(1),foo(1)它也将执行(作为您的代码),但不会将结果存储在任何地方。你不能s = self.foo(1),因为self不会在成员函数之外定义。但是,您可以直接调用它s = foo(1)并存储在成员中s

慕沐林林

其他人提供了运行代码的示例,但我认为存在一个更深层次的问题,即不了解Python的工作原理。这里要理解的是,与 Java 或 C# 等其他语言不同,在 Python 中,类的“主体”是在创建类期间执行的代码块。class创建一个特殊作用域,然后运行主体内部的所有内容,然后使用类主体中收集的所有符号创建类。它也与 Ruby 不同,后者首先创建类,然后执行主体(它有一个self表示类本身的方法,您可以调用类似的方法attr_accessor):在 Python 中,首先执行主体,然后创建类。需要注意的另一件事是,在 Pythonself中并不完全是神奇的,而是当您编写obj.foo()Python 时将其执行为type(obj).foo(obj). 从技术上讲,您甚至不必调用第一个参数self。这表示:在您的第一个片段中,在您定义方法之后,您尝试在此时甚至不存在的东西上调用它(您还没有创建一个self可以调用的方法)在您的第二个片段中,该函数存在于范围内,但尚未转换为方法,因此它仍在等待一个位置参数。在您的第三个片段中,该函数存在于范围中并且不带参数,您可以调用它,但是如果您之后尝试在实例上调用它,它将无法正常工作PS:基本上你可以想到:class Foo:    ...作为简写def Foo_body:    ...    return locals()Foo = type("Foo", (object,), Foo_body())
随时随地看视频慕课网APP

相关分类

Python
我要回答