静态属性
静态属性就是将类中的函数封装,实现像调用数据属性一样的方式调用函数属性,在python中利用@property语句实现
封装的概念:使得调用者无法察觉到被调用对象的实现逻辑,就是对象的封装
#不利用@property的方式
class Room:
def __init__(self, name, owner, width, length, height):
self.name = name
self.owner = owner
self.width = width
self.length = length
self.height = height
def cal_area(self):
print("%s住的%s,面积为%s" % (self.owner, self.name, self.width * self.length))
R1 = Room("公寓", "MB", 100, 100, 100)
R1.cal_area()#这里可以被看出调用的是一个函数属性
#利用@property的方式
class Room:
def __init__(self, name, owner, width, length, height):
self.name = name
self.owner = owner
self.width = width
self.length = length
self.height = height
@property
def cal_area(self):
return self.width * self.length #注意为了实现和数据属性相同的调用方式,需要加入return值
R1 = Room("公寓", "MB", 100, 100, 100)
print(R1.name)
print(R1.cal_area)#这里函数属性的调用已经完全和数据属性相同了
类方法
用在需要类中的函数不和实例捆绑时,即不通过实例去调用类的某个函数(函数末尾有self参数,就说明了这个函数和实例绑定。有cls参数,就说明和类绑定)
利用@classmethod语句,将某个属性只和类绑定而不和实例绑定
#不利用@classmethod的方法
class Room:
tag = 1
def __init__(self, name, owner, width, length, height):
self.name = name
self.owner = owner
self.width = width
self.length = length
self.height = height
R1 = Room("公寓", "MB", 100, 100, 100)
print(R1.tag)#想得出这个tag,需要产生一个实例并调用它的tag属性
#利用@classmethod的方法
class Room:
tag = 1
def __init__(self, name, owner, width, length, height):
self.name = name
self.owner = owner
self.width = width
self.length = length
self.height = height
@classmethod
def tell_info(cls):
print(cls.tag)
R1 = Room("公寓", "MB", 100, 100, 100)
Room.tell_info()#python会自动将Room传给cls参数
通过@classmethod定义过的方法就是给类用的,R1.tell_info()虽然也可以运行,但是不规范(相当于R1将自己所属的类传入了cls)
静态方法
静态方法只是名义上归属类管理,通过类和实例都可以调用,即这个属性既不和实例绑定也不和类绑定,叫做类的工具包
通过@staticmethod语句,实现类的静态方法
class Room:
def __init__(self, name, owner, width, length, height):
self.name = name
self.owner = owner
self.width = width
self.length = length
self.height = height
@staticmethod
def take_shower(name1, name2, name3):
print("%s,%s,%s is taking shower together" % (name1, name2, name3))
R1 = Room("公寓", "MB", 100, 100, 100)
Room.take_shower("CJJ", "MB", "LGJ")#通过类可以调用
R1.take_shower("CJJ", "MB", "LGJ")#通过实例可以调用
如果不写@staticmethod,例如def test():
这个函数只能通过类调用,不能实例调用
总结
静态属性:即可以访问实例属性,也可以访问类属性
类方法:可以访问类属性,不能访问实例属性
静态方法:不能访问类属性也不能访问实例属性