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 如果確實沒有編碼基礎,先學會用,在用的過程中去理解,不更好嗎?