天天看點

python學習筆記(五)——靜态方法、類方法、運算符重載

我們都知道類名是不能夠直接調用類方法的。在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'>