当前位置:首页 > 新闻中心

Python实用技巧——类,属性与装饰器

来源:维思自动化发布时间:2018-05-24 13:37:40

规范的编程模式,即使在很小的程序中也能使程序可读性更高。以一个简单的电力计算类为例,可以看出Python的类,属性与装饰器的一些用法与技巧。

专业背景

LoadCalculation类是用于计算试验负载(loadbank)参数的。LoadBank是试验室常用的设备之一,通常由无感电阻器和空心电抗器组成,在开关电器的短路、寿命等试验中作为负载使用,以保证试验过程严格按照标准规范进行。标准要求的试验参数一般包括电压、电流和功率因数,相应的负载参数计算是以欧姆定律为基础,根据电压、电流和功率因数参数,计算需要投入的电阻与电感值,从而在理论上满足试验要求。

依赖模块

本程序运行在python3.6.5下,需要导入以下模块支持


from math import sqrt,pifrom functools import wraps

类的建立

以下为python中定义LoadCalculation类并对其初始化的代码。

···python

class LoadCalculation:

def init(self,voltage,current,cosf):

"""

负载计算必须初始化输入电压、电流与功率因数作为参数

单位分别为V,A

:param voltage:

:param current:

:param cosf:

根据输入参数计算出 电阻、电抗以及电感值

"""

self._voltage=voltage

self._current=current

self._cosf=cosf

self._sinf= self.sinf

self._impedance=self.impedance #计算总阻抗,单位欧姆

self._resistance=self.resistance # 电阻的阻抗值,单位欧姆

self._reactance=self.reactance # 电感的感抗值,单位欧姆

self._inductance=self.inductance #电感的电感值,单位 毫亨

···

为了提高程序的执行效率,我们在类初始化的时候,便对所有需要的参数进行了计算,这些计算后的参数通过属性的形式将私有变量保存在Python类中。

属性与装饰器

装饰器是Python中一个非常好用的功能,简单而言,是针对函数进行一个外部包装,以统一实现某种通用的功能。在本类的计算过程中,由于涉及大量浮点运算,保留统一的小数位数非常有必要,利用python内置的round()函数,可以实现指定小数位数的保留,比如round(x,2),为参数x保留2位小数,但是如果在程序中多处都要指定小数位数,那么就会有许多round函数分散在程序中,如果要求对小数位数进行修改,查找起来很不方便。因此为程序写一个setround的装饰器来实现该功能。

这个装饰器内置了accuracy参数,设置默认小数位数为4位,如果在调用装饰器时需要修改精度,只需要指定accuracy参数即可。


def setround(func,accuracy=4): """ 装饰器,用于确定函数返回的浮点值位数,默认保留4位小数 :param func: :return: """ @wraps(func) def wrapper(*args,**kwargs): result=round(func(*args,**kwargs),accuracy) return result return wrapper

除了自己写的装饰器外,python也内置了很多现成的装饰器,property便是其中应用最广泛的一个,在本类中,我们对各个主要参数均使用了property装饰器以简化实现。


@property @setround def sinf(self): #self._sinf=round(sqrt(1-self._cosf**2),4) self._sinf = sqrt(1 - self._cosf ** 2) return self._sinf @property @setround def impedance(self): if self._current!=0: self._impedance=self._voltage/self._current else: self._impedance=-1 return self._impedance @property @setround def resistance(self): if self._impedance!=-1: self._resistance=self._impedance*self._cosf else: self._resistance=-1 return self._resistance @property @setround def reactance(self): if self._impedance!=-1: self._reactance=self._impedance*self.sinf else: self._reactance=-1 return self._reactance @property @setround def inductance(self): if self._impedance!=-1: self._inductance=10*self.reactance/pi else: self._inductance=-1 return self._inductance···## 单元测试由于本类内容较少,采用doctest模块进行测试,即可满足要求。测试部分直接写在类的docstring中。```python """ 用于计算阻抗相关参数的类 #Doctest String >>> load=LoadCalculation(voltage=24,current=100,cosf=0.25) >>> print(load.sinf) 0.9682 >>> print(load.impedance) 0.24 >>> print(load.resistance) 0.06 >>> print(load.reactance) 0.2324 >>> print(load.inductance) 0.7398 """

当然,上述程序只是简单的负载计算类的建立,在实际的工程应用中,我们在此基础上建立了完整的负载模型,包括不同电阻的电阻率、载流量、空心电抗器参数等计算,可以根据用户测试要求,快速生成从理论建模到工程生产需要的各项参数,并根据计算参数进行生产与验证。

此外,该类还用于对成套负载进行参数计算,结合负载不同档位与参数值,程序可以快速计算出不同试验要求下需要投切的负载档位,在用户实际使用的过程中,可以根据阻抗自身的特性(主要是回路和档位固有功率因数的影响),对计算值进行调节与更新,以便在后续的试验中能够更加快速与准确。

所有过程数据保存在sqlite数据库中。

  • 香港王中王中特网0149
  • 六和彩开码台,六和彩特码彩库图
  • www6335conn
  • 123870管家婆开奖结果
  • 六和玄机,香港和法六和彩
  • 牛蛙彩票15700开奖现场
  • 无错六肖中特50期一
  • 香港正版挂牌
  • 2019年香港曾氏总纲诗001-150期全年彩图资料
  • 于搅珠当天起计60天内领奖
  • 2019年马会内部输尽光
  • 彩霸王中特网正宗老牌
  • 免费股票数据接口
  • 六盒宝典开奖结果今晚2018
  • 778849com
  • 看天线宝宝找玄机,六和开`奖
  • 2018香港马报资料大全
  • 2019年极准正版生肖诗
  • 香港正版码报资料2018
  • 正版挂牌彩图自动更新
  • 2019年香港另版香江赌经001-150期全年彩图资料
  • 香港六和财神网,六和五行
  • 31678开奖现场
  • 港百小金人标准
  • 2019年香港地藏王001-150期全年彩图资料
  • 六合投注方法
  • 彩票网址大全,香港九龙六和彩网
  • 3d专3d专家预测最准确今天, 至尊心水 下载
  • 手机开码结果现场直播
  • 今天买什么码和生肖
  • 仙人指路1马会开奖结果1中特免
  • 四不像动物必中一肖
  • 天际100香港观景台
  • 六合特区联盟!高手交流论坛
  • 2019年香港曾女士百灵鸟001-150期全年彩图资料
  • 聊天报码,六和彩开奖中心
  • 马会正版香港资料大全
  • 彩库宝典2018最新版本
  • 新跑狗图每期更新香港
  • 166555.com开奖结果
  • 1122333藏宝阁开奖资料今晚
  • 2018十二生肖每月运势
  • 雷锋码王心水报彩图
  • 香港精选料,透码必中单双
  • 118图库彩图跑狗图
  • 2019年香港波色生肖诗001-150期全年彩图资料
  • 这里是红姐统一图库
  • 香港马会正版资料大全
  • 香港六和彩2018,蓝月亮六和彩论坛
  • 香港九龙官方网0820
  • 一码一肖期期准2018
  • 香港报码室,红太阳聊天室
  • 白小姐龙卷风B
  • 香港马会免费资料公开
  • 东方心经A
  • 东方心经红姐苹果日报
  • 2018内部版输尽光
  • 

    西安总部:

    400-029-9162
    029-89135860
    18909292360

    上海办事处:

    021-59815902-801
    18602902962

    微信

    扫一扫加我微信

    在线客服