python的類的 靜態屬性 類方法 靜態方法


一、靜態屬性

靜態屬性說的就是數據屬性

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 用類可以調用靜態方法,實例也可以調用靜態方法

          不跟類和實例綁定,只叫類的工具包


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM