我們都知道類名是不能夠直接調用類方法的。在C++中,把成員方法聲明為 static 靜态方法後可以通過類名調用。同樣的在python中也可以通過定義靜态方法的方式讓類名直接調用。
靜态方法
使用
@staticmethod
後緊跟着的方法為靜态方法。
class test:
var = 10
@staticmethod
def func():
print("var = ",test.var)
ts=test() #執行個體化
ts.func() #使用對象調用靜态方法
test.func() #使用類名調用靜态方法
輸出:
var = 10
var = 10
在靜态方法的參數清單中沒有 self ,也就意味着它不可以調用我們類中的執行個體屬性和執行個體方法。但是可以通過我們的類名調用類屬性。
類方法
使用
@classmethod
後面緊跟着的方法為類方法。同樣,類方法也支援類名通路和執行個體通路。
class test:
var = 10
@classmethod
def mytest(cls): # cls 代表類名
print("這是類方法")
ts=test() #執行個體化
ts.mytest() #使用對象調用類方法
test.mytest() #使用類名調用類方法
輸出:
這是類方法
這是類方法
在類方法的參數清單中 cls 是類名的代表,也就是說,在類方法中可以調用靜态方法和類屬性。
class test:
@staticmethod
def func():
print("這是靜态方法")
@classmethod
def mytest(cls):
print("這是類方法")
test.func()
ts=test()
ts.mytest()
test.mytest()
輸出:
這是類方法
這是靜态方法
這是類方法
這是靜态方法
并且,由于靜态方法是全局的,也是可以調用類方法的。
運算符重載
在python中形如
__xxx__
的方法不需要我們手動調用,在運作至條件發生時會自動調用。比如我們的
__init__
或
__del__
等。
我們現在重載 “+” 運算,使其對象相加隻加年齡,那麼就可以這麼寫。
class test:
def __init__(self, name, age):
self.name = name
self.age = age
def __add__(self, other): #重載
return self.age + other.age
ts1 = test("張三",18)
ts2 = test("李四",20)
age = ts1 + ts2
print(age)
輸出:
38
在 python 中調用 print() 列印執行個體對象時會調用__str__(),輸出一些資訊。如果__str__()中有傳回值,就會列印其中的傳回值。
ts = test("張三",18)
print(ts)
輸出:
<__main__.test object at 0x00000272E61C35F8>
我們現在重載 str 使得調用print() 時輸出我們想要的資訊。執行個體名 + 類型。
class test:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return '名字是%s,類型是%s'%(self.name,type(self))
ts = test("張三",18)
print(ts)
輸出:
名字是張三,類型是<class '__main__.test'>