一、靜態屬性
靜態屬性說的就是數據屬性
1、定義一個房間的類,求下這個房間的面積
class Room: def __init__(self,name,ower,width,length,heigh): self.Name=name self.Ower=ower self.Width=width self.Length=length self.Heigh=heigh r1=Room("廁所","北爺",2,2,20000)#實例化出來一個實例r1,實例化的過程就是執行__init__ print(r1.__dict__)#查看下r1這個實例的屬性字典 print("%s 住的%s 總面積是%s平米的地下室" %(r1.Ower,r1.Name,r1.Width*r1.Length))#進行字符串拼接 C:\python35\python3.exe D:/pyproject/day25/靜態屬性.py {'Length': 2, 'Ower': '北爺', 'Name': '廁所', 'Heigh': 20000, 'Width': 2} 北爺 住的廁所 總面積是4平米的地下室
2、又來了一個人,又要求下他的房子的面積
class Room: def __init__(self,name,ower,width,length,heigh): self.Name=name self.Ower=ower self.Width=width self.Length=length self.Heigh=heigh r1=Room("廁所","北爺",2,2,20000)#實例化出來一個實例r1,實例化的過程就是執行__init__ r2=Room("北京","喵爺",20,60,20000) # print(r1.__dict__)#查看下r1這個實例的屬性字典 print("%s 住的%s 總面積是%s平米的地下室" %(r1.Ower,r1.Name,r1.Width*r1.Length))#進行字符串拼接 print("%s 住的%s 總面積是%s平米的地下室" %(r2.Ower,r2.Name,r2.Width*r1.Length)) C:\python35\python3.exe D:/pyproject/day25/靜態屬性.py 北爺 住的廁所 總面積是4平米的地下室 喵爺 住的北京 總面積是40平米的地下室
3、我們這樣做肯定是不行的。這相當於是在外面完成的這件事情,而且很麻煩,應該把這個計算面積弄成一個函數
class Room: def __init__(self,name,ower,width,length,heigh): self.Name=name self.Ower=ower self.Width=width self.Length=length self.Heigh=heigh def cal_area(self): print("%s 住的%s 總面積是%s平米的地下室" %(self.Ower, self.Name, self.Width * self.Length)) r1=Room("廁所","北爺",2,2,20000)#實例化出來一個實例r1,實例化的過程就是執行__init__ r2=Room("北京","喵爺",20,60,20000)#實例化第二個實例 r1.cal_area()#實例調用類的函數屬性會自動傳實例本身作為參數 r2.cal_area()#實例調用類的函數屬性會自動傳實例本身作為參數 C:\python35\python3.exe D:/pyproject/day25/靜態屬性.py 北爺 住的廁所 總面積是4平米的地下室 喵爺 住的北京 總面積是1200平米的地下室
4、property裝飾器
class Room: def __init__(self,name,ower,width,length,heigh): self.Name=name self.Ower=ower self.Width=width self.Length=length self.Heigh=heigh @property #把一個方法變成一個數據屬性 def cal_area(self): print("%s 住的%s 總面積是%s平米的地下室" %(self.Ower, self.Name, self.Width * self.Length)) r1=Room("廁所","北爺",2,2,20000)#實例化出來一個實例r1,實例化的過程就是執行__init__ r2=Room("北京","喵爺",20,60,20000) r1.cal_area#用了property這個裝飾器之后,實例在調用函數屬性就等於調用數據屬性,不用加()就可以調用 r2.cal_area C:\python35\python3.exe D:/pyproject/day25/靜態屬性.py 北爺 住的廁所 總面積是4平米的地下室 喵爺 住的北京 總面積是1200平米的地下室
5、這樣還不行。因為正常的數據屬性直接運行是沒有返回值的
6、現在改為了直接return一個返回值,現在用起來的效果就是跟調用數據屬性是一模一樣的了,property這個裝飾器就是把類的函數屬性變為數據屬性,也就是封裝成了數據屬性
class Room: def __init__(self,name,ower,width,length,heigh): self.Name=name self.Ower=ower self.Width=width self.Length=length self.Heigh=heigh @property #把一個方法變成一個數據屬性 def cal_area(self): # print("%s 住的%s 總面積是%s平米的地下室" %(self.Ower, self.Name, self.Width * self.Length)) # return (self.Width * self.Length) return "%s 住的%s 總面積是%s平米的地下室" % (self.Ower, self.Name, self.Width * self.Length) r1=Room("廁所","北爺",2,2,20000)#實例化出來一個實例r1,實例化的過程就是執行__init__ r2=Room("北京","喵爺",20,60,20000) print(r1.cal_area)#用了property這個裝飾器之后,實例在調用函數屬性就等於調用數據屬性,不用加()就可以調用 print(r2.cal_area) print(r1.Name)#調用r1這個實例的數據屬性 print(r2.Name)#調用r2這個實例的數據屬性 C:\python35\python3.exe D:/pyproject/day25/靜態屬性.py 北爺 住的廁所 總面積是4平米的地下室 喵爺 住的北京 總面積是1200平米的地下室 廁所 北京
7、算是完美了,我們在增加一個計算體積的,當做是練習一下
class Room: def __init__(self,name,ower,width,length,heigh): self.Name=name self.Ower=ower self.Width=width self.Length=length self.Heigh=heigh @property #把一個方法變成一個數據屬性 def cal_area(self): # print("%s 住的%s 總面積是%s平米的地下室" %(self.Ower, self.Name, self.Width * self.Length)) # return (self.Width * self.Length) return "%s 住的%s 總面積是%s平米的地下室" % (self.Ower, self.Name, self.Width * self.Length) @property def cal_tiji(self): return "%s 住的%s 總體積是%s平米的地下室" % (self.Ower, self.Name, self.Width * self.Length * self.Heigh) r1=Room("廁所","北爺",2,2,20000)#實例化出來一個實例r1,實例化的過程就是執行__init__ r2=Room("北京","喵爺",20,60,20000) r3=Room("西安","修電腦",20,60,20000) print(r1.cal_area)#用了property這個裝飾器之后,實例在調用函數屬性就等於調用數據屬性,不用加()就可以調用 print(r2.cal_area) print(r3.cal_tiji) C:\python35\python3.exe D:/pyproject/day25/靜態屬性.py 北爺 住的廁所 總面積是4平米的地下室 喵爺 住的北京 總面積是1200平米的地下室 修電腦 住的西安 總體積是24000000平米的地下室
二、類方法
1、類是怎么調用自己的數據屬性呢
class Room: tag=1#定義一個類的數據屬性 def __init__(self,name,ower,width,length,heigh): self.Name=name self.Ower=ower self.Width=width self.Length=length self.Heigh=heigh @property #把一個方法變成一個數據屬性 def cal_area(self): return "%s 住的%s 總面積是%s平米的地下室" % (self.Ower, self.Name, self.Width * self.Length) @property def cal_tiji(self): return "%s 住的%s 總體積是%s平米的地下室" % (self.Ower, self.Name, self.Width * self.Length * self.Heigh) print(Room.tag) C:\python35\python3.exe D:/pyproject/day25/靜態屬性.py 1
2、由於self把類和實例綁定到一起了,所以我們的折中方案就是先生成一個實例,然后在用類去調用方法,把實例手動穿進去
class Room: tag=1#定義一個類的數據屬性 def __init__(self,name,ower,width,length,heigh): self.Name=name self.Ower=ower self.Width=width self.Length=length self.Heigh=heigh def tell_info(self): print("---->",self.tag) r1 = Room("廁所", "北爺", 2, 2, 20000) Room.tell_info(r1)#類調用類的函數屬性的時候需要手動傳實例本身 C:\python35\python3.exe D:/pyproject/day25/靜態屬性.py 1 ----> 1
3、但是我如果只想執行類的方法,不想跟任何實例有捆綁,該怎么做呢,python給我們提供了classmethod這個裝飾器,只要用了這個方法, 就表示這個裝飾器下面的方法是專門給類用的
這個方法就是只是類在調用類的方法,跟實例沒關系,只要加了classmethod就只能供類調用
class Room: tag=1#定義一個類的數據屬性 def __init__(self,name,ower,width,length,heigh): self.Name=name self.Ower=ower self.Width=width self.Length=length self.Heigh=heigh @classmethod#這個裝飾器是專門供類使用的方法 def tell_info(cls):#cls代表類本身 print(cls) print("---",cls.tag)#等價於Room.tag Room.tell_info()#會自動把類本身傳給cls C:\python35\python3.exe D:/pyproject/day25/靜態屬性.py <class '__main__.Room'> --- 1
三、靜態方法 叫類的工具包,不跟類綁定也不跟實例綁定
class Room: tag=1#定義一個類的數據屬性 def __init__(self,name,ower,width,length,heigh): self.Name=name self.Ower=ower self.Width=width self.Length=length self.Heigh=heigh @classmethod#這個裝飾器是專門供類使用的方法 def tell_info(cls):#cls代表類本身 print(cls) print("---",cls.tag) @staticmethod#靜態方法 叫類的工具包,不跟類綁定也不跟實例綁定 def wash_body(a,b,c): print("%s %s %s 正在洗澡" %(a,b,c)) Room.wash_body("北爺","喵爺","修電腦")#用類調用washbody這個方法 r1=Room("廁所","北爺",2,2,20000)#實例化一個實例r1 r1.wash_body("北爺","喵爺","修電腦")#用實例調用washbody這個方法 C:\python35\python3.exe D:/pyproject/day25/靜態方法.py 北爺 喵爺 修電腦 正在洗澡 北爺 喵爺 修電腦 正在洗澡
查看下 這個靜態方法是不是存到了類的屬性字典里面
class Room: tag=1#定義一個類的數據屬性 def __init__(self,name,ower,width,length,heigh): self.Name=name self.Ower=ower self.Width=width self.Length=length self.Heigh=heigh @classmethod#這個裝飾器是專門供類使用的方法 def tell_info(cls):#cls代表類本身 print(cls) print("---",cls.tag) @staticmethod#靜態方法 叫類的工具包,不跟類綁定也不跟實例綁定 def wash_body(a,b,c): print("%s %s %s 正在洗澡" %(a,b,c)) Room.wash_body("北爺","喵爺","修電腦")#用類調用washbody這個方法 print(Room.__dict__)#查看下靜態方法 結果是定義到了類的屬性字典里面了
總結:
靜態屬性:property類和實例都可以訪問靜態屬性
(把函數封裝成一個數據屬性,讓外面的人感受不 到是調用的函數屬性)
類方法: classmethod只能類訪問類方法,不能用實例訪問類方法
靜態方法:staticmethod 用類可以調用靜態方法,實例也可以調用靜態方法
不跟類和實例綁定,只叫類的工具包
