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

我们首先做一个比较:

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. freemarker嵌入文件输出结果

    freemarker嵌入文件输出结果 1.嵌入的文件代码 inc.ftl: <#assign username="李思思"> 2.父文件代码 inner.ftl: &l ...

  2. TOJ 4120 Zombies VS Plants

    链接:http://acm.tju.edu.cn/toj/showp4120.html 4120.   Zombies VS Plants Time Limit: 1.0 Seconds   Memo ...

  3. freemarker中的if...elseif...else语句(七)

    freemarker中的if...elseif...else语句 1.设计示例 <#if student.studentAge lt 12> ${student.studentName}不 ...

  4. android小程序之幸运菜谱

    android小程序之幸运菜谱 前言:刚刚结束短短5天的android公开课程,收获不少,写下来记录一下吧!(因为学校校企公开课的缘故才偶然接触的android,所以只学了这几天,不喜勿喷) 一开始得 ...

  5. es6中一些基本的使用方法

    es6中一些基本的使用方法 const 定义常量 let 块级变量 用let定义的变量只在块当中起作用,离开变量外界的块(括号)就会被销毁. 模板字面量 用于字符串拼接和写模板,使用 ` (反引号,左 ...

  6. Jmeter_针对响应信息不明确的接口做关联

    下午写一个新功能的接口脚本,遇到几个技术问题,现在将解决方案写出来 1:做接口关联的时候,发现接口响应没有可以利用的信息.如下图只返回了一个成功的标识,这样的接口如何与之关联? 通过抓包观察后续的修改 ...

  7. ls-grep-find组合命令解决企业问题实战

    ls -l|grep “^d”  以d开头 ls -lF  给不同文件类型加不同标志 ls -lF|grep  “/$” 以/结尾 ls -lF|grep  / find ./ -type d fin ...

  8. textarea高度随内容自适应

    最近遇到一个需求,视频名称初始有个生成值,并且支持可以手动修改,修改后名称过长后换行高度随内容增加.刚开始想到用input但是发现input不支持换行.后来用了textarea,用js来控制,下面是实 ...

  9. c#事件的应用

    我已经多次使用c#事件了.举个最近的例子:我用vsto做的一个word插件.这个插件分为两层,业务逻辑层和word外接程序.有这么一个场景,我的ribbon中的一个label是动态显示的.它会随着wo ...

  10. C#开发Open-Webkit-Sharp浏览器并支持前端alert显示

    看了网上的很多教程,但是总是总是只言片语的,可能不同的人遇到的问题不一样,他们就只列举了自己的问题,那么这里我来做一下总结吧,跟大家分享一下我的完整的开发过程 首先你需要准备Visual Studio ...