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)。

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

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())
添加回答
舉報