Python有哪些属性和特性

  介绍

这篇文章将为大家详细讲解有关Python有哪些属性和特性,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

<强>一、类属性,实例属性,私有属性与特性

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

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

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

私有属性:

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

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

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

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

注意:

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

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

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

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

<强>二、使用特性验证属性

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

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

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

class  LineItem ():   def 才能__init__(自我、描述、重量、价格):   ,,,self.description=描述   ,,,self.weight=重量   ,,,self.price=价格   ,   def 才能;小计(自我):   ,,,return  self.weight * self.price   ,   @ property #才能读值。   def 才能;体重(自我):   ,,,return  self.__weight #真正的值存储在私有属性中。   ,   ,@weight.setter   def 才能;体重(自我价值):   ,,,if  value 在0:   ,,,,,self.__weight=值#有效值存入私有属性中。   ,,,:   ,,,,,raise  ValueError (& # 39; Value  must  be 祝辞,0 & # 39;)#对于无效的值抛出ValueError。

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

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

class  LineItem:   def 才能;__init__(自我,,描述,重量,,价格):   ,,,self.description =,描述   ,,,self.weight =重量   ,,,self.price =价格   ,   def 才能;小计(自我):   ,,,return  self.weight  * self.price   ,   def 才能get_weight(自我):,#普通读值方法。   ,,,return  self.__weight   ,   def 才能;set_weight(自我,,值):,#普通设值方法。   ,,,if  value 祝辞,0:   ,,,,,self.__weight =价值   ,,,:   ,,,,,raise  ValueError (& # 39; value  must  be 祝辞,0 & # 39;)   weight 才能=,财产(get_weight, set_weight), #构建房地产对象,赋值给公开的类特性。

属性构造方法的完整签名:

属性(fget=没有,fset=没有,fdel=没有,医生=None)

<强>三,特性工厂函数

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

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

def 数量(storage_name):,   ,   def 才能qty_getter(实例):,#,实例指的是要把属性存储其中的LineItem实例。   ,,,return  instance.__dict__ [storage_name], #,引用闭包中的自由变量storage_name,值直接从instance.__dict__中获取,以便跳过特性,防止无限递归。   ,   def 才能qty_setter(实例,,值):,   ,,,if  value 祝辞,0:   ,,,,,instance.__dict__ [storage_name],=, value  #,同理存储,跳过特性。   ,,,:   ,,,,,raise  ValueError (& # 39; value  must  be 祝辞,0 & # 39;)   ,   return 才能;财产(qty_getter, qty_setter), #,构建自定义特性对象并返回。   ,   class  LineItem:   weight 才能=,数量(& # 39;重量# 39;),#,将自定义特性体重定义为类属性。   price 才能=,数量(& # 39;价格# 39;),#,同上。   ,   def 才能;__init__(自我,,描述,重量,,价格):   ,,,self.description =,描述   ,,,self.weight =, weight  #,此处特性已经激活,可验证值的有效性。   ,,,self.price =价格   ,   def 才能;小计(自我):   ,,,return  self.weight  *, self.price  #,此处利用特性获取实例中存储的值。

Python有哪些属性和特性