@property
# property是一个装饰器函数 ,作用:将一个方法伪装成属性
# 所有的装饰器函数都怎么用? 在函数、方法、类的上面一行直接@装饰器的名字
# 装饰器的分类:
# 装饰函数
# 装饰方法 : property
# 装饰类
class Student: def __init__(self,name,age): self.__name = name self.age = age @property # 将一个方法伪装成一个属性 def name(self): return self.__name zhuge = Student('诸葛',20) print(zhuge.name)
计算一个圆的面积和周长
from math import pi class Circle: def __init__(self,r): self.r = r @property def area(self): return self.r**2*pi @property def perimeter(self): return 2*self.r *pi c1 = Circle(10) print(c1.area) print(c1.perimeter)
Goods的实例
class Goods: __discount = 0.8 def __init__(self,price): self.__price = price @property def price(self): return self.__price*Goods.__discount @price.setter def price(self,new): self.__price = new @price.deleter def price(self): del self.__price # 真的删除,可以赋值 apple = Goods(10) print(apple.price) apple.price = 8 print(apple.price)
# 只有当被property装饰的方法
# 又实现了一个同名方法
# 且被setter装饰器装饰了
# 且在对被装饰的方法赋值的时候 就可以出发被setter装饰器方法
# 作用:用来保护一个变量,在修改的时候能够添加一些保护条件
# 一个方法被伪装成属性之后
# 应该执行一个属性的增删改查的操作
# 那么增删和修改,就对应着被setter装饰的方法,这个方法又一个必传的参数new,表示赋值的时候等号后的值
# 删除一个属性 对应着 被deleter装饰的方法,这个方法并不能在执行的时候真的被删除,而是在代码中执行什么就有什么效果。
@classmethod 类方法
class Goods: __discount = 0.8 def __init__(self,price): self.__price = price @property def price(self): return self.__price*Goods.__discount @classmethod def chang_discount(cls,new): # 类方法 cls.__discount = new apple = Goods(10) banana = Goods(20) Goods.chang_discount(0.7) # 改变了类中私有属性 # print(Goods.__dict__) print(apple.price) print(banana.price)
特点:只使用类中的资源,且这个资源可以直接用类名引用的使用,那这个方法应该被改为一个方法
# @staticmethod 将类外面的函数 拿到里面
class Student: # 静态方法 @staticmethod # 可以把外面的函数拿到类里面写 def login(usr,pwd): # 相当于将他变成普通方法,可以不用self传参。通过类名点方法名调用 print('in login',usr,pwd) Student.login('user','pwd')