类中的装饰器(内置函数)property、classmethod、staticmethod
property 法伪装成属性
-
把一个方法伪装成一个属性,在调用这个方法的时候不用加()就可以直接得到返回值
-
装饰的这个方法是不能有参数的
from math import pi #pi是圆周率 class Circle(object): def __init__(self,r): self.r=r @property def area(self): return pi*self.r**2 circle=Circle(6) print(circle.area)
#计算年龄 import time class Person(object): def __init__(self,name,birth): self.name=name self.birth=birth #birth是出生日期,工作中一般只存出生日期 @property def age(self): return time.localtime().tm_year-self.birth #当前年限减去出生日期 person=Person('wangminmin',2002) print(person.age)
-
property的第二个场景,和私有属性的合作,(只可以看不能改)
class User(object): def __init__(self,usr,pwd): self.usr=usr self.__pwd=pwd @property def pwd(self): return self.__pwd user=User('wanminmin',"132465") print(user.pwd)
- 修改值 : 属性名+setter
# 商品打8折 class Goods(object): discount=0.8 def __init__(self,name,origin_price):#origin_price商品原价 self.name=name self.__origin_price=origin_price @property def origin_price(self): #origin_price return self.__origin_price * self.discount @origin_price.setter #origin_price #此三处的名字要一样 def origin_price(self,new_value): #origin_price#new_value 用来接受要修改的值 self.__origin_price=new_value #修改的值对被修改的值进行替换 goods=Goods('火柴',5) print(goods.name) print(goods.origin_price) goods.origin_price=10 print(goods.origin_price) # 火柴 # 4.0 # 8.0
- 删除 属性名+deleter:并不是正真的修改什么,只是调用被@属性名+deleter装饰的方法而已
# 商品打8折 class Goods(object): discount=0.8 def __init__(self,name,origin_price):#origin_price商品原价 self.name=name self.__origin_price=origin_price @property def origin_price(self): #origin_price return self.__origin_price * self.discount @origin_price.setter #origin_price #此三处的名字要一样 def origin_price(self,new_value): #origin_price#new_value 用来接受要修改的值 self.__origin_price=new_value #修改的值对被修改的值进行替换 @origin_price.deleter #此处origin_price和下方origin_price名字必须一致 def origin_price(self): del self.origin_price #删除私有属性 goods=Goods('火柴',5) print(goods.name) print(goods.origin_price) goods.origin_price=10 print(goods.origin_price) del goods.origin_price
classmethod 类方法
-
修改对象绑定的方法为类方法
-
在方法中仍然可以引用类中的静态变量
-
可以不用实例化对象,就可以用类名在外部调用这个方法(也可以用对象名调用)
-
什么时候使用?
- 定义了一个方法,默认传self,但这个sels没有被使用
- 并且你在这个方法里用到了当前类的静态变量,或者准备使用这个类的内存空间的名字的时候
-
class Goods(object): __discount=0.8 def __init__(self): self.__price=5 @property def price(self): self.__price=self.__price*Goods.__discount return self.__price @classmethod def changes_discount(cls,new_discount): #修改实例方法为类方法 cls.__discount=new_discount return Goods.__discount goods=Goods() Goods.changes_discount(0.6) print(goods.price)
-
在类内部的类方法中进行实例化方法,然后在外部取值
# 获取当前年月日 import time class Date(object): def __init__(self,year,month,day): self.year=year self.month=month self.day=day @classmethod def today(cls): #在类内部的类方法中进行实例化方法,然后在外部取值 struct_t=time.localtime() date=Date(struct_t.tm_year,struct_t.tm_mon,struct_t.tm_mday) return date da=Date.today() print(da.year) print(da.month) print(da.day) 得: 2021 5 31
-
staticmethod 静态方法
-
被装饰的方法会成为一个静态方法
-
帮助我们把一个函数直接挪到类中直接使用,制造静态方法用的
-
可以用类名调用,也可以用对象名调用
class Longin(object): @staticmethod def user(a,b): print(a,b) Longin.user(1,2)