類方法是對類中定義的函數的稱呼,有別於一般函數的是,它的第一個參數是固定的,表示類實例化後實例本身。
爲什麼類方法的第一個參數必須爲指代實例本身的參數?
這裏要介紹一下類中的變量類型
類中的變量有兩種類型:類變量 和 實例變量
類變量:
在類方法外,命名方式和普通變量一樣,在類方法內使用 “類.變量” 的方式表示。
實例變量:
帶有 “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也相同。