美文网首页python人工智能我爱编程程序员
Python实用技巧——类,属性与装饰器

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

作者: afbbcde7fa3e | 来源:发表于2018-04-13 15:12 被阅读18次

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

    专业背景

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

    依赖模块

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

    from math import sqrt,pi
    from functools import wraps
    

    类的建立

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

    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参数即可。
    
    ```python
       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数据库中。

    相关文章

      网友评论

        本文标题:Python实用技巧——类,属性与装饰器

        本文链接:https://www.haomeiwen.com/subject/spbckftx.html