• day28 property 装饰器


    方法属性装饰器 
    本质上来说就是将方法的执行括号去掉,这样将一个方法掩饰成了一个变量名字,变成了类似属性的东西
    内置装饰器函数,只在面向对象中使用
     1 from math import pi
     2 class Cricle:
     3     def     __init__(self,r):
     4         self.r = r
     5     @property
     6     def perimeter(self):
     7         return 2*pi*self.r
     8     @property
     9     def area(self):
    10         return pi*self.r**2
    11 
    12 c1 = Cricle(5)
    13 
    14 print(c1.perimeter)            # 伪装成一个变量,变成一个属性
    15 # print(c1.perimeter())        # 之前的实现方式
    16 print(c1.area)
    17 # print(c1.area())


    既然是属性能不能改呢~
      很明显是不能的
     1 class Person:
     2     def __init__(self,name,high,weight):
     3         self.name = name
     4         self.high = high
     5         self.weight = weight
     6     @property
     7     def     bmi(self):
     8         return self.weight / self.high ** 2
     9 suyang = Person("苏阳",1.5,180)
    10 # print(suyang.bmi())    # 原先的调用方式
    11 print(suyang.bmi)    # 80.0
    12 suyang.name = "sb"
    13 # suyang.bmi = 18            # 既然是属性,改改试试?.
    14     # AttributeError: can't set attribute    # 毕竟特么不是属性,本质上是方法啊


    property 的实际用例
      商品打折
        不让用户知道真实的价格只能看到打折后的价格
     1 class Goods:
     2     discount = 0.5                    # 打折力度 5折
     3     def __init__(self,name,price):
     4         self.name = name
     5         self.__price = price        # 我才不会让别人知道我的价格
     6     @property
     7     def price(self):
     8         return self.__price * Goods.discount
     9 
    10 apple = Goods("苏阳",0.5)            
    11 print(apple.price)


    补充:
      修改属性 @ name.setter,将原有的属性进行更改替换
     1 class Person:
     2     def __init__(self,name):
     3         self.__name = name
     4     @property
     5     def name(self):
     6         return self.__name +"sb"
     7     @name.setter                # 一般很难用到,计算出来的值一般是直接用不需要再处理了
     8     def    name(self,new_name):
     9         self.__name = new_name
    10 suyang  =  Person("苏阳")
    11 print(suyang.name)    # 苏阳sb
    12 suyang.name    = "suyang"
    13 print(suyang.name)    # suyangsb

  • 相关阅读:
    HTTP深入浅出 http请求
    javascript 新兴的API
    javascript 高级技巧详解
    javascript AJAX与Comet详解
    php文件扩展名判断
    php创建新用户注册界面布局实例
    php使用递归创建多级目录
    php对文本文件进行分页功能简单实现
    php上传功能集后缀名判断和随机命名
    php判断数据库是否连接成功的测试例子
  • 原文地址:https://www.cnblogs.com/shijieli/p/9922775.html
Copyright © 2020-2023  润新知