为了账号安全,请及时绑定邮箱和手机立即绑定

NameError: name 'self' is not defined 解释

NameError: name 'self' is not defined 解释

摇曳的蔷薇 2022-07-12 18:29:23
我试图了解“自我”是如何工作的。在第一个代码中,我得到了错误,但我相信我做的一切都是正确的。在那之后,我尝试了更多的东西来解决它,但不能。我在这里想念什么?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() 工作过
查看完整描述

3 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超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)。


查看完整回答
反对 回复 2022-07-12
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

为什么?


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

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


你不能s = self.foo(1),因为self不会在成员函数之外定义。但是,您可以直接调用它s = foo(1)并存储在成员中s


查看完整回答
反对 回复 2022-07-12
?
慕沐林林

TA贡献2016条经验 获得超9个赞

其他人提供了运行代码的示例,但我认为存在一个更深层次的问题,即不了解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())


查看完整回答
反对 回复 2022-07-12
  • 3 回答
  • 0 关注
  • 1021 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号