# 类的静态属性:把函数属性变成数据属性,这样进行了假装,表面上看是数据属性,实质是函数属性,静态方法语法糖:@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