python極簡教程08:對象的方法
測試奇譚,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 如果確實沒有編碼基礎,先學會用,在用的過程中去理解,不更好嗎?