類方法/類函數第一個參數爲什麼是“self”?

類方法是對類中定義的函數的稱呼,有別於一般函數的是,它的第一個參數是固定的,表示類實例化後實例本身。
爲什麼類方法的第一個參數必須爲指代實例本身的參數?
這裏要介紹一下類中的變量類型
類中的變量有兩種類型:類變量實例變量
類變量
在類方法外,命名方式和普通變量一樣,在類方法內使用 “類.變量” 的方式表示。
實例變量
帶有 “self” 前綴的即爲 實例變量 。因爲它要帶有 “self” 前綴,所以它必定位於類方法內。

實例變量 是類實例化後擁有的變量,適用範圍只限於一個實例內,多個實例不共享。
類變量 的使用不需要類實例化,且類實例化後,多個實例共享類變量。

先看類變量 的使用不需要類實例化
定義,__init__函數是內置方法,效果是運行類後自動運行其函數,不用像別的函數那樣 顯式調用
顯示調用:若要使用A中foo的方法必須a.foo(),其中a.foo()爲顯示調用

class A(object):
    class_var = 0
    def __init__(self):
        A.class_var += 1
    def foo(self):
        print("Axxx.class_var is {}".format(id(A.class_var)))
        print("self.class_var is {}".format(id(self.class_var)))
    def bar(self):
        print("Total is {}".format(A.class_var))
        print("self is {}".format(self.class_var))
a=A()

運行

A
a.bar()

結果是

Total is 1
self is 1

可以看到 類變量 使用不需要類實例化,並且被實例化後的實例共享

類變量 在與 實例變量 值不同前,其id與 實例變量 保持一致,即共享同一個存儲單元
運行

a.foo()

結果

Axxx.class_var is 140726138671968
self.class_var is 140726138671968

再次驗證

class A(object):
    class_var = 0
    def __init__(self):
        A.class_var += 1
        self.class_var += 1
    def foo(self):
        print("Axxx.class_var is {}".format(id(A.class_var)))
        print("self.class_var is {}".format(id(self.class_var)))
    def bar(self):
        print("Total is {}".format(A.class_var))
        print("self is {}".format(self.class_var))
a=A()
a.foo()
a.bar()
Axxx.class_var is 140726138671936
self.class_var is 140726138671968
Total is 1
self is 2

實例變量 值被加了兩次,然後我們調換A.class_var += 1 和 self.class_var += 1 位置

class A(object):
    class_var = 0
    def __init__(self):
        self.class_var += 1
        A.class_var += 1
    def foo(self):
        print("Axxx.class_var is {}".format(id(A.class_var)))
        print("self.class_var is {}".format(id(self.class_var)))
    def bar(self):
        print("Total is {}".format(A.class_var))
        print("self is {}".format(self.class_var))
a=A()
a.foo()
a.bar()

結果是

Axxx.class_var is 140726138671936
self.class_var is 140726138671936
Total is 1
self is 1

實例變量 值被加了一次,與類變量 的值保持不變,所以它們的id也相同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章