zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    利用Powershell和ceye.io实现Windows账户密码回传
    Local Response Normalization作用——对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力
    python 读取二进制文件 转为16进制输出
    滴滴持续扩招私车 倒逼官方就范
    滴滴专车——司机提现流程
    滴滴专车司机升降级标准流程
    北京Uber优步司机奖励政策(9月21日~9月27日)
    滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(9月12日~9月18日)
    北京Uber优步司机奖励政策(9月14日~9月20日)
    天津市人民优步Uber司机奖励政策(9月14日~9月20日)
  • 原文地址:https://www.cnblogs.com/renshengruxi/p/15704846.html
Copyright © 2011-2022 走看看