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

我们首先做一个比较:

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/

Python中的classmethod与staticmethod的更多相关文章

  1. 【python】Python 中的 classmethod 和 staticmethod

    Python 中的 classmethod 和 staticmethod 有什么具体用途? 推荐地址:http://www.cnblogs.com/wangyongsong/p/6750454.htm ...

  2. Python 中的 classmethod 和 staticmethod 有什么具体用途?

    作者:李保银链接:https://www.zhihu.com/question/20021164/answer/18224953来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  3. 关于Python中的classmethod

    Python 中的 classmethod classmethod: 作用是直接将自己的类对象,传给类方法. 一.classmethod 1)不用classmethod的时候 你的代码可能是这样写的, ...

  4. 【开发者笔记】python中的类方法(@classmethod)和静态方法(@staticmethod)

    在java.c#等高级语言中我们用static来定义静态方法和静态变量,那么在python中如何定义静态方法和静态变量呢. python提供了@classmethod和@staticmethod来定义 ...

  5. Python中classmethod与staticmethod区别

    classmethod:类方法staticmethod:静态方法 在python中,静态方法和类方法都是可以通过类对象和类对象实例访问.但是区别是: @classmethod 是一个函数修饰符,它表示 ...

  6. python中@classmethod @staticmethod区别

    Python中3种方式定义类方法, 常规方式, @classmethod修饰方式, @staticmethod修饰方式. class A(object): def foo(self, x): prin ...

  7. python中@staticmethod、@classmethod和实例方法

    1.形式上的异同点: 在形式上,Python中:实例方法必须有self,类方法用@classmethod装饰必须有cls,静态方法用@staticmethod装饰不必加cls或self,如下代码所示: ...

  8. 关于python中的类方法(classmethod)和静态方法(staticmethod)

    首先明确两点: a)python在创建类的时候,self指向的是类的实例而不是类属性! b)我们所创建的类的方法有两种作用,一种是改变类的属性,一种是改变实例的属性,这点一定要分清! c)我们在调用类 ...

  9. [转]python中@classmethod @staticmethod区别

    Python中3种方式定义类方法, 常规方式, @classmethod修饰方式, @staticmethod修饰方式. class A(object): def foo(self, x): prin ...

随机推荐

  1. python爬虫--爬取某网站电影下载地址

    前言:因为自己还是python世界的一名小学生,还有很多路要走,所以本文以目的为向导,达到目的即可,对于那些我自己都没弄懂的原理,不做去做过多解释,以免误人子弟,大家可以网上搜索. 友情提示:本代码用 ...

  2. WPF基础篇之控件模板(ControlTemplate)

    WPF中每一个控件都有一个默认的模板,该模板描述了控件的外观以及外观对外界刺激所做出的反应.我们可以自定义一个模板来替换掉控件的默认模板以便打造个性化的控件. 与Style不同,Style只能改变控件 ...

  3. zk个人入门学习总结(1)

    ZooKeeper是一种分布式协调服务,用于管理大型主机.在分布式环境中协调和管理服务是一个复杂的过程.ZooKeeper通过其简单的架构和API解决了这个问题.ZooKeeper允许开发人员专注于核 ...

  4. 下一代 Android

    据闻,Android M 是下一代 Android 的开发代号.那么,对于 M,Google 正在实验着什么? 指纹识别 根据此前的消息,Nexus 6 据称原本是包含指纹识别传感器的,但后来在开发过 ...

  5. 【BZOJ1007】水平可见直线(单调栈)

    [BZOJ1007]水平可见直线(单调栈) 题解 Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为 可见的 ...

  6. 【HAOI2015】树上操作(树链剖分)

    题面 Description 有一棵点数为N的树,以点1为根,且树点有边权.然后有M个操作,分为三种: 操作1:把某个节点x的点权增加a. 操作2:把某个节点x为根的子树中所有点的点权都增加a. 操作 ...

  7. ssr 服务端安装教程

    1 ShadowsocksR 多用户版服务端安装教程(SS-Panel后端) 2 ShadowsocksR 单用户版服务端安装教程

  8. 论文笔记(2):Deep Crisp Boundaries: From Boundaries to Higher-level Tasks

    ---------------------------------------------------------------------------------------------------- ...

  9. kerberos下JAVA代码操作hbase的方式(客户端方式,应用程序方式)

    (一)如果部署JAVA 代码的主机用户获取了kerberos权限情况下 假设主机名是:client su - client 登录主机后 kinit -kt /keytab的路径/client.keyt ...

  10. Hadoop3.0完全分布式集群安装部署

    1. 配置为1个namenode(master主机),2个datanode(slave1主机+slave2主机)的hadoop集群模式, 在VMWare中构建3台运行Ubuntu的机器作为服务器: 关 ...