类与实例属性
class Room:
style='欧式豪宅'
def __init__(self,owner,width,length,heigh):
self.owner=owner
self.width=width
self.length=length
self.heigh=heigh
def area(self):
return self.width*self.length
p=Room('Alex',10,20,10)#类的实例
print(p.__dict__)#实例有的属性(通常实例只要数据属性,需要调用类的函数属性(方法)进行操作)
print(Room.__dict__)#类的数据属性与函数属性
print(p.area())#实例调用类的函数属性
静态属性
在函数属性上加@property,实例p可以通过p.area直接调用,看起来像是实例拥有了属性area
class Room:
style='欧式豪宅'
def __init__(self,owner,width,length,heigh):
self.owner=owner
self.width=width
self.length=length
self.heigh=heigh
@property
def area(self):
return self.width*self.length
p=Room('Alex',10,20,10)#类的实例
print(p.__dict__)#实例有的属性(通常实例只要数据属性,需要调用类的函数属性(方法)进行操作)
print(Room.__dict__)#类的数据属性与函数属性
print(p.area)#实例调用类的函数属性(注意area后没有括号)
p.area=10#会报错
类方法
class Room:
style='欧式豪宅'
def __init__(self,owner,width,length,heigh):
self.owner=owner
self.width=width
self.length=length
self.heigh=heigh
@property
def area(self):
return self.width*self.length
def tell_style(self):
return self.style
p=Room('Alex',10,20,10)
Room.tell_style()#会报错,直接用类访问函数得不到类属性style的值,为此必须建立一个实例,才能访问.
#当然直接用Room.style就可以得到,但是我们希望可以通过函数来访问到
print(p.tell_style())#可以用实例访问到类属性style
print(p.__dict__)
print(Room.__dict__)
于是有类方法@classmethod
class Room:
style='欧式豪宅'
def __init__(self,owner,width,length,heigh):
self.owner=owner
self.width=width
self.length=length
self.heigh=heigh
@property
def area(self):
return self.width*self.length
@classmethod
def tell_style(cls):
return cls.style
p=Room('Alex',10,20,10)
print(Room.tell_style())#可以直接用类函数访问到
print(p.tell_style())#当然实例也可以访问到,但是不推荐,因为这叫类方法,应该只是为了类去调用
print(p.__dict__)
print(Room.__dict__)
静态方法
@staticmethod
class Room:
style='欧式豪宅'
def __init__(self,owner,width,length,heigh):
self.owner=owner
self.width=width
self.length=length
self.heigh=heigh
@property
def area(self):
return self.width*self.length
@classmethod
def tell_style(cls):
return cls.style
@staticmethod
def wash(a):
return '%s is washing shower'%a#静态方法,类的工具包,访问不到类与实例的属性
def test():
print('这不是静态方法,用类调用没问题,但不能用实例调用')
p=Room('Alex',10,20,10)
print(Room.wash('Alex'))#类可以调用
print(p.wash('Alex'))#实例可以调用
Room.test()
p.test()#会报错
print(p.__dict__)
print(Room.__dict__)