在OO(面向?qū)ο?編程中,類中的方法有多種形式:實例方法袖肥、靜態(tài)方法咪辱、類方法、甚至還可以有抽象方法椎组,本文來說說實例方法在Python中是如何工作的油狂,后面再來談其他方法。
先來定義一個最簡單類:
classPerson:
def__init__(self, name):
self.name = name
defeat(self):
print(self)# <__main__.Person object at 0x00
print(type(self))#
print(self.name +" is eating")
這里的eat就是一個實例方法寸癌,跟普通函數(shù)差不多专筷,唯一的不同是必須指定一個參數(shù)self,盡管名字可以任意命名蒸苇,但約定俗成的叫 self磷蛹,self 是什么?它代表Person類的實例對象溪烤,就像Java中的this一樣弦聂,看下面的測試代碼
p = Person("zhangsan")
p.eat()
p與self指向同一個實例對象
那么可不可以通過類直接調(diào)用呢?不行氛什!
Person.eat()
TypeError:?eat()?missing?1?required?positional?argument:?'self'
那為什么通過實例p調(diào)用eat方法不需要傳遞self參數(shù)呢莺葫?這個就要從函數(shù)與方法的區(qū)別說起。來看看下面的代碼:
print(Person.eat)
print(p.eat)
# 輸出
>
前者是函數(shù)枪眉,后者是方法捺檬,有人說函數(shù)定義在類外面,方法定義在類里面贸铜,顯示這種說法不全面堡纬,那么他們的區(qū)別在哪里?
首先方法是與某個對象相關(guān)聯(lián)的蒿秦,而函數(shù)則不是烤镐,p.eat就是一個綁定了實例對象的方法,函數(shù)的所有參數(shù)都需要顯示地傳遞棍鳖,而方法中的數(shù)據(jù)是隱式傳遞的炮叶。Person.eat是函數(shù),參數(shù)要顯示地傳遞渡处,Person.eat(p)
而方法因為綁定了實例對象镜悉,所以他調(diào)用的時候無需再傳遞實例對象了,直接調(diào)用p.eat()就可以了医瘫,self參數(shù)Python會自動傳遞過去侣肄,如果重復(fù)傳遞會報錯。
p.eat(p)
TypeError: eat() takes1positional argument but2were given
所以醇份,本質(zhì)上
p.eat()?等價于?Person.eat(p)
那么對于實例方法稼锅,self 參數(shù)從語言設(shè)計的角度來說吼具,是不是可以去掉呢,這個問題 Python 之父 Guido van Rossum 撰文解釋過這件事矩距,理由是 “Explicit is better than implicit”在信息更新的非侈趾校快速,又迎來了大數(shù)據(jù)的時代剩晴, 各行各業(yè)如果不與時俱進锣咒,都將面臨優(yōu)勝劣汰侵状,知識是不斷的更新的赞弥,只有一技之長,才能立于不敗之地趣兄。
學習Python編程語言绽左,是大家走入編程世界的最理想選擇,在初期入門階段就可以自己動手做一些實用的小項目艇潭,這樣會極大的增進我們學習編程的 熱情拼窥。學好python你需要一個良好的環(huán)境,一個優(yōu)質(zhì)的開發(fā)交流群蹋凝,群里都是那種相互幫助的人才是可以的鲁纠,我有建立一個python學習交流群,在群里我們相互幫助鳍寂,相互關(guān)心改含,相互分享內(nèi)容,這樣出問題幫助你的人就比較多迄汛,群號是301加上056最後069捍壤,這樣就可以找到大神聚合的群,如果你只愿意別人幫助你鞍爱,不愿意分享或者幫助別人鹃觉,那就請不要加了,你把你會的告訴別人這是一種分享睹逃。
感覺寫的好盗扇,對你有幫助,就點個贊唄沉填,別光只收藏哈.~( ̄▽ ̄)~