Python 名称错误:名称';自我';没有定义解释

Python 名称错误:名称';自我';没有定义解释,python,python-3.x,Python,Python 3.x,我试图理解“自我”是如何运作的。在第一段代码中,我犯了错误,但我相信我做的一切都是对的。在那之后,我尝试了更多的事情来解决它,但无法解决。我错过了什么 class myClass: def foo(self): print('WORKED') self.foo() NameError:未定义名称“self” TypeError:foo()缺少1个必需的位置参数:“self” 工作 工作 (此处pylint给出警告,说明“方法没有参数”) 正确的用法是

我试图理解“自我”是如何运作的。在第一段代码中,我犯了错误,但我相信我做的一切都是对的。在那之后,我尝试了更多的事情来解决它,但无法解决。我错过了什么

class myClass:
    def foo(self):
            print('WORKED')
    self.foo()
NameError:未定义名称“self”


TypeError:foo()缺少1个必需的位置参数:“self”


工作 工作

(此处pylint给出警告,说明“方法没有参数”)


正确的用法是:

class MyClass:
    def foo(self):
        print('WORKED')

    def bar(self):
        self.foo()


obj = MyClass()
obj.bar()
必须使用参数
self
定义方法。调用
obj.foo()
时,它将自动作为
obj
传递。也就是说,
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)
:

因此,如果您在不调用
self
的情况下调用
foo()
,它将被视为类字段。如果您直接输入字段声明(即
s=foo(1)
being
foo(1)
),它也将执行(作为您的代码),但不会将结果存储在任何地方


您不能
s=self.foo(1)
,因为
self
不会在成员函数之外定义。但是,您可以直接调用它
s=foo(1)
并将其存储在成员
s
中。其他人提供了运行的代码示例,但我认为还有一个更深层次的问题,那就是不理解Python是如何工作的

这里需要理解的是,与Java或C#等其他语言不同,在Python中,类的“主体”是在创建类的过程中执行的代码块

class
创建一个特殊作用域,然后运行主体内部的所有符号,然后使用主体中收集的所有符号创建该类。它也不同于Ruby,Ruby首先创建类,然后执行主体(它有一个表示类本身的
self
,您可以调用类似
attr\u accessor
)的方法:在Python中,首先执行主体,然后创建类

另一件需要注意的事情是,在Python中,self并不是很神奇,而是当您编写
obj.foo()
Python以
type(obj).foo(obj)
的形式执行它。从技术上讲,您甚至不必调用第一个参数
self

这意味着:

  • 在您的第一个代码片段中,就在您定义了方法之后,您尝试在此时甚至不存在的某个对象上调用它(您还没有创建可以调用的
    self
  • 在第二个代码段中,函数存在于作用域中,但尚未转换为方法,因此它仍在等待一个位置参数
  • 在第三个代码段中,该函数存在于作用域中,不接受任何参数,您可以调用它,但是如果您尝试在之后对实例调用它,它将无法正常工作
PS:基本上你可以想到:

Foo类:
...
简写

def Foo_体:
...
返回本地人()
Foo=type(“Foo”,(对象),Foo_body())

self
是调用方法的实例,如
o=myClass();o、 foo()
您可以学习面向对象代码,所以我不能在self中的类中调用method?(在MyClass中调用
self.foo()
)@hhilal您可以在方法内部使用
self
,从这个角度看,它只是另一个函数参数。请参见bar调用foo的编辑版本。
class MyClass:
    def foo(self):
        print('WORKED')

    def bar(self):
        self.foo()


obj = MyClass()
obj.bar()
class myClass:
    def foo(s):
        print('WORKED', s)
        return s
    s = foo(1)
    print("Hello")
myClass.foo(2) 
print(myClass.s)
WORKED 1
Hello
WORKED 2
1