1樓:王加加
因為你定義的是物件的函式而不是類的函式。預設定義的是物件的函式,必須例項化後才能使用。這也是為什麼函式第乙個引數要傳入self,因為self是類例項化後得到的指向自己變數(類似於C++中的this指標)。
如果不是例項化的物件,函式就沒法得到self引數。
要想直接呼叫,有三種方法。
一種方法,呼叫的時候初始化物件。但是這種方法每次要建立新物件。如果你要多次呼叫,有點浪費資源。t3=
ReadConfig().
get_email
('mail_host'
)第二種方法,將get_email()設計為類函式:
class
ReadConfig
:@classmethod
defget_email
(cls
,name
):# do something
ReadConfig
.get_email
('mail_host'
)第三種方法,將get_email()設計為靜態函式:
class
ReadConfig
:@staticmethod
defget_email
(name
):# do something
ReadConfig
.get_email
('mail_host'
)ReadConfig().
get_email
('mail_host'
)注意到其中的區別。第一種方法,你之前定義的函式是屬於具體物件的,需要例項化之後才能使用。第二種方法,修飾符 @classmethod 則表明這個函式屬於類的函式,可以直接指定類名來呼叫(注意第乙個引數cls代表了類自己)。
第三種方法,修飾符 @staticmethod 表明這是個靜態函式,這個函式既可以在類中呼叫,也可以在例項化後的物件中呼叫。
2樓:凌心誠
因為例項方法需要例項才能呼叫。類去呼叫自己例項的方法時,你就要傳乙個此類的例項進去。也就是那個self引數所在的位置。記住必須是此類的例項,比如
class A:
def f(self,x):
pass
a=A()
A.f(a,x)
這樣是可以通過類去呼叫例項方法的,但你不覺得這樣呼叫毫無用處,純屬虛華俗麗麼?
3樓:黃哥
報錯資訊清楚明白,呼叫get_email方法時少傳了乙個位置引數name。
get_mail 方法你設計成例項方法,類不能直接呼叫。
類直接呼叫例項方法,需要這樣,但不推薦這樣寫,要不設計成類方法或靜態方法。
或者直接用例項呼叫例項方法。請參考樓下的回答。
為什麼 Python 3 中類可以直接呼叫例項方法,Python 2 中卻不行?
Manjusaka 靈劍 老大已經說了 3.0 移除了 unbound method 的概念,直接呼叫函式就被當做乙個普通函式處理 詳情參見 What s New In Python 3.0 曲奇 確實和直譯器的實現有關係。但我建議不要在這個方向上深究,鑽牛角尖無助於提公升程式設計功力。Python...
Python多繼承用super呼叫父類方法?
python的super傳遞 python多重繼承的super呼叫父類的兄弟類 30天嘗試新事情 如果要呼叫父類的父類,可以直接用類名 類名需要在mro裡面 多重繼承 class A def init selfprint A init print self def fun selfprint A s...
(JavaScript)為什麼無法呼叫函式內的函式?
已登出 new的作用是建立乙個物件,然後把這個物件作為thisArg傳遞給被呼叫的函式,然後把這個物件作為返回值返回。所以v new f 大致上 並不完全 可以看作 f.call v 那麼v的值是什麼呢?那麼v或其原型鏈上是否具有f1呢?沒有。以上。 建議學習 原型鏈 v.f是undefined。v...