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)
beingfoo(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
- 在第二个代码段中,函数存在于作用域中,但尚未转换为方法,因此它仍在等待一个位置参数
- 在第三个代码段中,该函数存在于作用域中,不接受任何参数,您可以调用它,但是如果您尝试在之后对实例调用它,它将无法正常工作
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