zoukankan      html  css  js  c++  java
  • Python中的classmethod与staticmethod

    首先,这是一个经典的问题。

    我们首先做一个比较:

    classmethod的第一个参数是cls,即调用的时候要把传入

    这意味着我们我们可以在classmethod里使用类的属性,而不是类的实例的属性(显式创建可用)

    staticmethod,调用的时候没有参数,即调用的时候我们不传入东西(类,类的实例)

    这意味着我们在staticmethod里无法得到类的实例(显式创建可用)

    而我们调用类的普通方法的时候,要把self传进去

    这意味着在这个普通方法里,我们只能使用类的实例(self)的属性方法

    至于怎么调用呢?看下面:

    class A(object):  
        bar = 1  
        def foo(self):  
            print 'foo'  
     
        @staticmethod  
        def static_foo():  
            print 'static_foo'  
            print A.bar    # static_foo位于class A中,A相当于全局的,所以能访问到A的属性
          A().foo() # static_foo位于class A中,A相当于全局的,所以能访问到A的方法
        @classmethod  
        def class_foo(cls):  
            print 'class_foo'  
            print cls.bar  # 等于调用 A.bar
            cls().foo()     # 等于调用 A().foo()
      
    A.static_foo()  
    A.class_foo()  

    输出:

    static_foo, 1,foo

    class_foo,1,foo

    一目了然

    类的实例可以调用类的classmethod和staticmethod,只是在这种情况下我们传入的第一个参数为类或者不传

    在classmethod里,我们无法通过cls来调用class里的普通方法,因为这些方法是需要self的

     那什么情况下会使用classmethod呢?当某个方法与这个类相关,依赖于类,但不依赖实例的时候,比如:

    假设若无法满足某个条件,就不能创建某个类的实例。那么这种条件可以作为classmethod写进去

    什么情况下会使用staticmethod呢?当某个方法与这个类相关,但是不依赖类与实例的时候,比如设置环境变量的时候。

    ref :https://www.pythoncentral.io/difference-between-staticmethod-and-classmethod-in-python/

  • 相关阅读:
    Xcode界面切换动画效果
    Objective—C中的排序及Compare陷阱
    串行口应用
    在windows上搭建C语言开发环境——借助eclipse和MinGW
    Leetcode--Two Sum
    C++语言笔记系列之十六——赋值兼容规则&多继承的二义性
    在Powerdesigner中创建概念数据模型
    数据模型
    数据描述的三个领域
    开启PowerDesigner15工具栏上的被禁用掉的图标
  • 原文地址:https://www.cnblogs.com/geeklove01/p/8213687.html
Copyright © 2011-2022 走看看