• Python中的staticmethod和classmethod Test


      在类中定义的所有函数都是对象的绑定方法,对象在调用绑定方法时会将自己作为参数传递给方法的第一个参数(即self)

      在类中还可以定义基于类名访问的函数:静态函数类函数

    静态函数使用装饰器@staticmethod定义;类函数使用@classmaethod定义。两者在使用方法上非常相似,只存在一些细微的差别:@classmethod装饰的函数必须使用类对象作为第一个参数,一般命名为cls;而@staticmethod装饰的函数则可以不传递任何函数。

      静态方法和类方法是为类定制设计的,在使用的时候,可以直接通过类名或类实例对象去访问。

    示例:

    class Download:
        """下载类"""
        @staticmethod
        def download_image(image_file):
            print('下载%s下的图片' %(image_file))
    
        @classmethod
        def dowload_movie(cls,movie_file):
            print('下载电影:%s' %(movie_file))
    
        def dowload(self):
            print('下载方法')
    
    Download.download_image('file/123.png')
    Download.dowload_movie('file/abc.mp4')
    
    Down = Download()
    Down.dowload()
    
    结果:
    下载file/123.png下的图片
    下载电影:file/abc.mp4
    下载方法

    在示例中我们分别定义可以通过类名访问的静态方法download_image()和类方法download_movie(),在类方法中需要显式的传递cls参数,cls参数表示传递的是类本身。

    同时还定义了对象方法download(),对象函数中的self参数表示实例化对象本身。

    staticmethod和classmethod的区别

    staticmethod:无论是类调用还是类的实例化对象调用,都无法获取到类内部的属性和方法。

    classmethod:无需实例化,可以调用类属性和类方法。

    实用案例:

    '''
    需求:
    通过面向对象编程的思路,定义三角形类,实现计算三角形的周长和面积。
    
    技术分析:
    第一步,定义一个‘三角形’类,通过传入3条边来构造三角形,并提供计算周长和面积的方法。由于传入的3条边未必能构造出来三角形对象,
    因此可以先创建一个方法来验证3条边是否可以构成三角形,这个方法显然不是对象方法,因此在调用这个方法时三角形对象尚未创建出来
    (因为还不知道这3条边能不能构成三角形)。
    第二步,使用静态方法来解决三角形周长和面积的计算问题。
    计算三角形的周长:周长h = 边a + 边b + 边c
    计算三角形的面积:
    已知三角形三边a,b,c,根据(海伦公式)
    (半周长p = (a+b+c)/2)
    面积S = math.sqrt(半周长p *(半周长p-边a) *(半周长p-边b)* (半周长p-边c)),其中math.sqrt方法为开平方根。
    '''
    
    from math import sqrt
    
    class Triangle(object):
    
        def __init__(self,a,b,c):
            self._a = a
            self._b = b
            self._c = c
    
        @staticmethod
        def is_valid(a,b,c):
            return a+b > c and b+c > a and a+c > b
    
        # 计算周长
        def perimeter(self):
            return self._a+self._b+self._c
    
        # 计算面积
        def area(self):
            half = self.perimeter()/2
            return sqrt(half * (half-self._a) * (half-self._b) * (half-self._c))
    
    def main():
        a,b,c = 3,4,5
        # 静态方法和类方法都是通过给类发消息来调用的
        if Triangle.is_valid(a,b,c):
            t = Triangle(a,b,c)
            print('三角形的周长为:%s'%(t.perimeter()))
            print('三角形的面积为:%s' %(t.area()))
        else:
            print('无法构成三角形')
    
    if __name__=='__main__':
        main()
    
    结果:
    三角形的周长为:12
    三角形的面积为:6.0
  • 相关阅读:
    超星电子书下载攻略
    快速生成PDF书签
    2016抢票软件分享
    Win10安装framework3.5
    .NET破解之分享给新注册的朋友
    封装JedisClient.提供API实现对redis的操作
    java操作redis集群配置[可配置密码]和工具类
    redis 集群java.lang.NoSuchMethodError:SpringJAR包版本冲突错误解决方法
    linux端口开放指定端口的两种方法
    redis requires ruby version 2.2.2的解决方案
  • 原文地址:https://www.cnblogs.com/renshengruxi/p/15704846.html
Copyright © 2020-2023  润新知