# 類的靜態屬性:把函數屬性變成數據屬性,這樣進行了假裝,表面上看是數據屬性,實質是函數屬性,靜態方法語法糖:@property
a='aa'
b='bb'
class Room():
tag='建築物' #類的靜態屬性
def __init__(self,name,long,width):
self.long=long
self.width=width
self.name=name
@property #在方法屬性前加上 @property,使該方法屬性變成了類的靜態屬性,調用方法:實例.方法名,做用:假裝成靜態屬性,讓用戶不知道其內部邏輯
def cal_area(self):
print('%s房子的面積是%d'%(self.name,self.width*self.long))
def owner(self):#普通方法
print('this is %s hours'%self.name)
#類方法:將方法屬性只跟類綁定,與實例無關,語法糖@classmethod,在類字典中
@classmethod
def tell_info(cls):#自動填入cls,即與類綁定
print('類型--->',cls.tag)
#類靜態方法:與類和實例都不綁定,它只是名義歸屬類管理,不能使用類變量和實例變量,是類的工具包,語法糖@staticmethod
@staticmethod
def test(a,b): #不自動填入cls和self,代表不和任何綁定,類和實例均可調用
print('%s 和 %s正在玩耍'%(a,b))
#print(self.width) 不能使用實例變量
#print(cls.tag) 也不能使用類變量
def test_1(name):
print("name=%s"%name)
r1=Room('xm',1,5)
r2=Room('mf',30,50)
r1.cal_area #變成靜態屬性後, r1.cal_area()變成調用屬性同樣r1.cal_area
r2.cal_area # r2.cal_area()--》r2.cal_area
Room.owner(r1)#通常方法屬性,用類調用時,必需傳入一個實例對象,類型---> 建築物
Room.tell_info()#類方法,用類調用,就不用傳入實例對象了,這樣與實例無任何關係了
Room.test('小紅','小白')#小紅 和 小白正在玩耍
r1.test('小黑','小王')#小黑 和 小王正在玩耍
r2.test(a,b)#aa 和 bb正在玩耍
Room.test_1('cat')#類能夠調用,對象不能夠調用,但通常不這樣用。
r1.test_1('小貓') #TypeError: test_1() takes 1 positional argument but 2 were given,自動傳入-個self參數,but 2 were given