类中的装饰器(内置函数)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)
    
posted @ 2021-06-03 16:40  刘家小仙女  阅读(64)  评论(0编辑  收藏  举报