python極簡教程08:物件的方法

測試奇譚發表於2022-01-20

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

相關文章