靜態屬性:
在類的函數屬性里面,加上一個property的裝飾器,這個函數屬性就是靜態屬性,調用方式和數據屬性一樣了,不用加括號
class School: tag = 1 def __init__(self,name,xiaozhang,lenth,widet): self.name = name self.xiaozhang = xiaozhang self.lenth = lenth self.widet = widet @property #靜態屬性 def test(self): return self.lenth*self.widet s1 = School('xx大學',123,313,214) print(s1.test) print(s1.tag) >>>66982 >>>1
從例子看出,調用靜態屬性,和調用類的數據屬性方法一樣,這樣用戶不會發現和數據屬性有什么不同,所以靜態屬性一般用來返回類比較常用的屬性,比如一個圓的類,用戶輸入了半徑,就可以定義一個圓面積的靜態屬性,也可以定義一個周長的靜態屬性,雖然我們是通過函數的方法實現,但用戶調用的時候比較方便。
類的函數屬性可以分成分成兩大類:
一:綁定方法(綁定給誰,誰來調用就自動將它本身當作第一個參數傳入):
1. 綁定到類的方法:用classmethod裝飾器裝飾的方法。
為類量身定制
類.boud_method(),自動將類當作第一個參數傳入
(其實對象也可調用,但仍將類當作第一個參數傳入)
2. 綁定到對象的方法:沒有被任何裝飾器裝飾的方法(就是正常的函數屬性)
為對象量身定制
對象.boud_method(),自動將對象當作第一個參數傳入
(屬於類的函數,類可以調用,但是必須按照函數的規則來,沒有自動傳值那么一說)
所以,綁定到類的方法,就是類方法,在類的函數屬性里面,加上一個classmethod的裝飾器,這個函數屬性就是類方法,調用方式和函數屬性一樣,但是要把括號里的self改成cls
class School: tag = 1 def __init__(self,name,xiaozhang,lenth,widet): self.name = name self.xiaozhang = xiaozhang self.lenth = lenth self.widet = widet @property #靜態屬性 def test(self): return self.lenth*self.widet @classmethod #類方法 def tell_info(cls): print(cls.tag) #分別用類和實例調用 School.tell_info() s1 = School('xx大學',123,313,214) s1.tell_info() #實例也可以調用,但是默認傳的第一個參數仍然是類 >>>1 >>>1
二:非綁定方法:用staticmethod裝飾器裝飾的方法
1. 不與類或對象綁定,類和對象都可以調用,但是沒有自動傳值那么一說。就是一個普通工具而已
注意:與綁定到對象方法區分開,在類中直接定義的函數,沒有被任何裝飾器裝飾的,都是綁定到對象的方法,可不是普通函數,對象調用該方法會自動傳值,而staticmethod裝飾的方法,不管誰來調用,都沒有自動傳值一說
所以靜態方法,就是在類內部用staticmethod裝飾的函數,是普通函數。statimethod不與類或對象綁定,誰都可以調用,沒有自動傳值效果,staticmethod只是名義上歸屬類管理,不能使用類變量和實例變量,是類的工具包
class School: tag = 1 def __init__(self,name,xiaozhang,lenth,widet): self.name = name self.xiaozhang = xiaozhang self.lenth = lenth self.widet = widet @property #靜態屬性 def test(self): return self.lenth*self.widet @classmethod #類方法 def tell_info(cls): print(cls.tag) @staticmethod #靜態方法 def test1(x,y): print(x*y) #分別用類和實例調用 School.test1(3,4) print(School.test1) s1 = School('xx大學',123,313,214) s1.test1(2,3) print(s1.test1) >>>12 >>><function School.test1 at 0x000002859750BAE8> #就是普通函數 >>>6 >>><function School.test1 at 0x000002859750BAE8> #就是普通函數
后續會講到__str__和__repr__,再演示一個類方法和靜態方法的實例,先保存這篇。