zoukankan      html  css  js  c++  java
  • python 类高级语法 静态方法

    通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法

    class dog(object):
    
        def __init__(self,name):
            self.name = name
    
        @staticmethod # 实际上跟类没什么关系
        def eat(self,):
            print("%s is eating %s" % ('ddd', 'dd'))
    
    
    d = dog("jianlin")
    d.eat()

    上面的代码执行 会出现错误

    说是eat需要一个self参数,但调用时却没有传递,没错,当eat变成静态方法后,再通过实例调用时就不会自动把实例本身当作一个参数传给self了。

    Traceback (most recent call last):
      File "C:/Users/Administrator.QH-20170325TNQR/PycharmProjects/SSSSS/SS/day7/静态方法1.py", line 17, in <module>
        d.eat()
    TypeError: eat() missing 1 required positional argument: 'self'

    变成静态方法后,与类没有什么关系了,相当于一个单独的函数 只是类下一个函数

    想让上面的代码可以正常工作有两种办法

    1. 调用时主动传递实例本身给eat方法,即d.eat(d) 

    2. 在eat方法中去掉self参数,但这也意味着,在eat中不能通过self.调用实例中的其它变量了

    方法一

    class dog(object):
    
        def __init__(self,name):
            self.name = name
    
        @staticmethod # 实际上跟类没什么关系
        def eat():
            print("%s is eating %s" % ('mike','包子'))
    
    
    d = dog("jianlin")
    d.eat()
    
    # mike is eating 包子

    方法二

    class dog(object):
    
        def __init__(self,name):
            self.name = name
    
        @staticmethod # 实际上跟类没什么关系
        def eat(self,):
            print("%s is eating %s" % (self.name, '包子'))
    
    
    d = dog("jianlin")
    d.eat(d)
    
    # jianlin is eating 包子
    最好用类调用静态方法 省内存

    class Foo(object):
    
        # 最好用类调用静态方法 省内存
        @staticmethod
        def f1(args1, args2):
            print(args1, args2)
    
    Foo.f1(123, 345)   # 类调用静态方法 执行
    
    
    # 123 345
     
  • 相关阅读:
    思科完成收买Pari Networks 增强智能办事
    天音控股拟与外企协作
    运营商竞速搭建手机支出公司
    C版iPhone 4入华期近 高性价比将引追逐
    诺基亚否认将中断塞班办事
    联通守旧国际遨游短信提醒
    思科宣布揭晓已完成收买Pari Networks的买卖
    各种“Phone”辈出 购置裸机或更划算
    台湾运营商看好中低端智能机加大推销量
    诺基亚Ovi商店开卖《水果忍者》
  • 原文地址:https://www.cnblogs.com/mingerlcm/p/8460283.html
Copyright © 2011-2022 走看看