2017-01-09 71 views
3
class A: 

    def __init__(self, text): 
     self.printStats() 
     A.printStats(text) 

    def printStats(self): 
     print(self) 

a = A("Hello") 

此打印:調用方法與自己和類名稱之間的區別?

<A object at 0x7f47e2f08ac8> 
Hello 

這是爲什麼(A.printStats(text))可能嗎?我明白髮生了什麼事情(self引用text),但我不明白爲什麼。

+3

'self.instance_method()'相當於'Class.instance_method(self)'。如果你的方法實際上沒有使用任何實例狀態(例如'self'上的訪問屬性),你可以傳入任何東西。 – jonrsharpe

+1

您正在將'text'(在您的示例中爲「Hello」)作爲'printStats'的'self'參數傳遞,這實際上不是您應該做的。但這就是爲什麼你看到「你好」打印。 – Tagc

+0

感謝您使用拼寫和語法的第一個問題!你不知道有多少低質量的第一篇文章... –

回答

1

當你創建類的實例:

a = A('some text') 

self爭論變成永久綁定到a,這是類背後的魔力。如果您嘗試a.printStats('something'),則會引發錯誤,因爲self參數已被a佔用。您可以使用a.printFunction.__func__恢復原有的未綁定自己的功能。嘗試a.printFunction.__func__('this will be self argument')

但是,當您不創建實例時,沒有什麼可以綁定self,因此self仍可供使用。在這種情況下,您可以將A作爲一個簡單的詞典保存功能。

A = {'__init__': someInitFunction, 
    'printStats': printStatsFunction} 

你要記住這個名字self是任意的,你可以用任何詞來代替,甚至not_self

4
A.printStats(text) 

不會撥打printStatsA的實例。它用一個字符串調用它 - 沒有通過self

def printStats(self): 
    # <--- here, "self" if the string "Hello", not an instance of A. 
    print(self) 

A.printStats(self)相當於self.printStats。同樣,如果你有一個功能printStatsWithPrefix;

class A: 
    def printStatsWithPrefix(self, prefix): 
     ... # function body goes here 

你必須做A.printStatsWithPrefix(self, prefix)


了一份關於風格:通過Python的約定(PEP 8),你應該使用lowercase_with_underscores的函數名。

+0

謝謝你的解釋。 「它用字符串調用它」是什麼意思?編輯:沒關係,明白了。 – d9h

+0

@d9h「調用」表示使用給定的參數執行功能。你執行了這個函數,而不是使用'self'作爲'A'的一個實例,而是使用了一個字符串。 –

+0

不要忘記接受,如果你覺得它有幫助! –

1

在Python 2中,您的代碼會失敗,因爲通過類調用方法要求該類的第一個參數實際上是該類的一個實例。

在Python 3中,實現沒有那麼嚴格,因爲第一個參數只能實現與類的實例有關的所需接口;不檢查參數是否是實例。而且由於你實際上並沒有通過self訪問printStats中的任何實例方法/變量,所以它可以工作,它只是打印傳遞的字符串'hello'

相關問題