最新公告
  • 欢迎您光临网站无忧模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Python中的属性和特性是什么

    正文概述    2020-07-29   207

    Python中的属性和特性是什么

    一、类属性、实例属性、私有属性与特性

    类属性:类属性在__init__()外初始化,属于类所有,所有实例共享一个属性。

    调用方法:类属性在内部用classname.类属性名调用,外部既可以用classname.类属性名又可以用instancename.类属性名来调用。

    实例属性:实例属性属于各个实例所有,互不干扰。

    私有属性:

    1.单下划线_开头:只是告诉别人这是私有属性,外部依然可以访问更改。

    2.双下划线__开头:外部不可通过instancename.propertyname来访问或者更改,实际将其转化为了_classname__propertyname。

    特性:是用于管理实例属性的类属性。

    特性用途:经常用于把公开的属性变成使用读值方法和设值方法管理的属性,且在不影响客户端代码的前提下实施业务规则。

    注意:

    不要对实例属性和类属性使用相同的名字。否则实例属性会遮盖类属性,发生难以发现的错误。

    实例属性不会遮盖类特性,但类特性会遮盖实例属性。

    这是因为obj.attr不会从实例obj开始寻找attr,而是从obj.__class__开始;而且仅当类中没有名为attr的特性时,Python才会在实例中寻找attr。

    简言之,就遮盖层级而言,类特性>实例属性>类属性。

    二、使用特性验证属性

    使用特性可以验证实例属性的有效性,同时能够根据已知属性和属性之间的关系式调整其他属性,避免硬编码。

    案例:假设某商店经营坚果、杂粮等多种有机食物,每位顾客的订单会包含店中的一系列商品,我们需要根据客户的订单计算出总价。

    分析:我们不希望顾客订单的商品重量为非正数,需要借助@property装饰器实现值的获取与设置,从而验证实例属性的有效性。代码如下:

    class LineItem():
      def __init__(self,description,weight,price):
        self.description=description
        self.weight=weight
        self.price=price
     
      def subtotal(self):
        return self.weight*self.price
     
      @property#读值。
      def weight(self):
        return self.__weight#真正的值存储在私有属性中。
     
      @weight.setter
      def weight(self,value):
        if value >0:
          self.__weight=value#有效值存入私有属性中。
        else:
          raise ValueError('Value must be > 0')#对于无效的值抛出ValueError。

    Tips:当我们需要设置只读属性时,只使用@property,无需使用@func.setter。

    相关推荐:《Python视频教程》

    原理解析:为了更好地理解@property装饰器的原理,我们写一版效果相同但没使用装饰器的代码。

    class LineItem:
      def __init__(self, description, weight, price):
        self.description = description
        self.weight = weight
        self.price = price
     
      def subtotal(self):
        return self.weight * self.price
     
      def get_weight(self): #普通读值方法。
        return self.__weight
     
      def set_weight(self, value): #普通设值方法。
        if value > 0:
          self.__weight = value
        else:
          raise ValueError('value must be > 0')
      weight = property(get_weight, set_weight) #构建property对象,赋值给公开的类特性。

    property 构造方法的完整签名:

    property(fget=None, fset=None, fdel=None, doc=None)

    三、特性工厂函数

    抽象定义特性的方式有两种,一是使用特性工厂函数,二是使用描述符类。

    下面我们用特性工厂函数来完成上文中提到的订单结算案例:

    def quantity(storage_name): 
     
      def qty_getter(instance): # instance指的是要把属性存储其中的LineItem实例。
        return instance.__dict__[storage_name] # 引用闭包中的自由变量storage_name,值直接从instance.__dict__中获取,以便跳过特性,防止无限递归。
     
      def qty_setter(instance, value): 
        if value > 0:
          instance.__dict__[storage_name] = value # 同理存储,跳过特性。
        else:
          raise ValueError('value must be > 0')
     
      return property(qty_getter, qty_setter) # 构建自定义特性对象并返回。
     
    class LineItem:
      weight = quantity('weight') # 将自定义特性weight定义为类属性。
      price = quantity('price') # 同上。
     
      def __init__(self, description, weight, price):
        self.description = description
        self.weight = weight # 此处特性已经激活,可验证值的有效性。
        self.price = price
     
      def subtotal(self):
        return self.weight * self.price # 此处利用特性获取实例中存储的值。

    四、使用特性删除属性

    class BlackKnight:
     def __init__(self):
       self.members = ['an arm', 'another arm',
               'a leg', 'another leg']
       self.phrases = ["'Tis but a scratch.",
               "It's just a flesh wound.",
               "I'm invincible!",
               "All right, we'll call it a draw."]
     
     @property
     def member(self):
       print('next member is:')
       return self.members[0]
     
     @member.deleter
     def member(self):
       text = 'BLACK KNIGHT (loses {})\n-- {}'
       print(text.format(self.members.pop(0), self.phrases.pop(0)))

    删除属性只需在主程序中发出指令:del obj.attr

    相关推荐:

    Python如何利用动态属性处理JSON数据源


    下载网 » Python中的属性和特性是什么

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元