python極簡教程08:物件的方法
阿新 • • 發佈:2022-01-18
測試奇譚,BUG不見。
講解之前,我先說說我的教程和網上其他教程的區別:
1 我分享的是我在工作中高頻使用的場景,是精華內容;
2 我分享的是學習方法,亦或說,是指明你該學哪些、該重點掌握哪些內容;
3 基於1和2,你可以按照我的教程學,也可以網上找視訊學,也可以看書學……你得明白,掌握學習方法比找學習資料重要得多。
這一場,主講python的面向物件的第二部分——物件的方法。
目的:掌握Python物件的五個核心方法。
init和new
講解之前,先上一段程式碼
class Demo: def __init__(self, name): print("init") print("init " + name) def __new__(cls, *args, **kwargs): print("new") print("new " + args[0]) d = Demo("張三")
通過前面的學習,你能說出這段程式碼執行的輸出結果嗎?
答案是:
#new
#new 張三
通常,我們會認為__init__()是類的初始化方法,當例項化類之後,會優先執行它(執行後應當優先輸出"init"、"init 張三"),但實際上,__new__()方法才優先執行的方法,同時,它也是建立物件的方法。
說得通俗一點:以造房子舉例,new方法是打地基,存放建材原料,init方法則是按照圖紙建造房子。
那麼,什麼時候用new方法?
其實,用得很少,更多的時候,我們使用的是init方法。但init方法用久了之後,就會誤以為它是建立例項的方法,而實際上,new方法才是建立例項的方法。
大家謹記,以免面試時踩坑。
類方法、靜態方法、物件方法
首先,先講講這三個方法如何使用。
- 類方法:使用 @classmethod 裝飾,第一個引數是cls
- 靜態方法:使用 @staticmethod 裝飾
- 物件方法:不使用裝飾器,第一個引數是self
class Cat: age = 5 area = 'Chengdu' def __init__(self, name): self.name = name # 這是一個有問題的方法 def drink(): print("Cat drink") # 這是一個靜態方法 @staticmethod def eat(food): print("Cat eat {}".format(food)) # 這是一個物件方法 def get_name(self): return self.name # 這是一個類方法 @classmethod def info(cls): print(cls.age) print(cls.area) print(self.name) # 例項化一隻叫Kitty的黑貓 black_cat = Cat('Kitty') # 有問題的方法,直接報錯了 # black_cat.drink() # 靜態方法呼叫 black_cat.eat('fish') # 可以例項(black_cat)呼叫 Cat.eat('fish') # 也可以類(Cat)呼叫 # 類方法呼叫 black_cat.info() # 可以例項(black_cat)呼叫 Cat.info() # 也可以類(Cat)呼叫 # 物件方法呼叫 print(black_cat.get_name()) # 只能例項(black_cat)呼叫
到這裡,你可能會問,這東西有啥用?
如果你只想寫個指令碼,執行一些簡單的程式,那確實沒啥用。你可以不關心這三個方法以及他們的呼叫,甚至連class類都不用寫,直接def搞定。
但是,如果你想進階,理解面向物件,它們很重要。
類方法
- @classmethod 修飾,第一個引數是 cls
- 方法作用:和例項無關,可以直接用
類名.方法名()
呼叫 - 可能會需要用到類變數(注意:不是成員變數)
- 可以類呼叫,也可以例項呼叫
靜態方法
- @staticmethod 修飾
- 方法作用:和例項無關,可以直接用
類名.方法名()
呼叫,相當於一個類對外界提供的工具方法 - 基本上不會用到類變數,用到類變數的話,只能硬編碼呼叫類變數
- 可以類呼叫,也可以例項呼叫
物件方法
- 第一個引數是self
- 例項的方法
- 可以訪問成員變數
- 只能例項呼叫,不能類呼叫
一如既往,做個總結
01 我知道,對於初學者來說,面向物件,這個抽象的概念很難理解,但是,我沒說,你一定要理解;
02 如果確實沒有編碼基礎,先學會用,在用的過程中去理解,不更好嗎?