class cesuo: addr = '九江' def __init__(self, name, h, l, k): self.name = name self.h = h self.l = l self.k = k @property #封装逻辑,让调用用户感知不存在,只和实例绑定 def cal(self): return ('%s体积是%s'%(self.name, self.h * self.l * self.k)) @classmethod #类方法,只和类捆绑,能访问到类的数据属性和函数属性,不能访问到实例的数据属性 def tell_info(cls): print(cls.addr) @staticmethod #静态方法,允许类和实例调用。不能访问类属性也不能访问实例属性,只能接收外部传值 def test(x,y,z): print(x,y,z) s1 = cesuo('公厕',12,23,11) print(s1.cal) #通过实例的静态熟悉去调用 cesuo.tell_info() #通过类方法,把类自己传递进去,好处是不需要实例化对象出来再去访问 cesuo.test(1,2,3) #调用静态方法 s1.test(5,6,7)
为什么要用property
将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问的原则
staticmethod:
不与类或对象绑定,类和对象都可以调用,但是没有自动传值那么一说。就是一个普通工具而已
classmethod:
classmehtod是给类用的,即绑定到类,类在使用时会将类本身当做参数传给类方法的第一个参数(即便是对象来调用也会将类当作第一个参数传入)