亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 973 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號