我的机器学习教程「美团」算法工程师带你入门机器学习  以及 「三分钟系列」数据结构与算法  已经开始更新了,欢迎大家订阅~这篇专栏整合了这几年的算法知识,简单易懂,也将是我实体书的BLOG版。

欢迎大家扫码关注微信公众号「图灵的猫」,除了有更多AI、算法、Python相关文章分享,还有免费的SSR节点和外网学习资料。其他平台(微信/知乎/B站)也是同名「图灵的猫」,不要迷路哦~

讲解一

一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。 
而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。 
这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。

既然@staticmethod和@classmethod都可以直接类名.方法名()来调用,那他们有什么区别呢 
从它们的使用上来看,

  • @staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
  • @classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。

    如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名。 
    而@classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。 
    下面上代码。

class A(object):  bar = 1  def foo(self):  print 'foo'  @staticmethod  def static_foo():  print 'static_foo'  print A.bar  @classmethod  def class_foo(cls):  print 'class_foo'  print cls.bar  cls().foo()
###执行
A.static_foo()
A.class_foo()  

输出

static_foo
1
class_foo
1
foo


讲解二

类中最常用的方法是实例方法, 即通过通过实例作为第一个参数的方法。 
举个例子,一个基本的实例方法就向下面这个:

class Kls(object):def __init__(self, data):self.data = datadef printd(self):print(self.data)
ik1 = Kls('arun')
ik2 = Kls('seema')
ik1.printd()
ik2.printd()

这会给出如下的输出:

arun
seema

 
然后看一下代码和示例图片:

  • 1,2参数传递给方法.
  • 3 self参数指向当前实例自身.
  • 4 我们不需要传递实例自身给方法,Python解释器自己会做这些操作的

如果现在我们想写一些仅仅与类交互而不是和实例交互的方法会怎么样呢? 我们可以在类外面写一个简单的方法来做这些,但是这样做就扩散了类代码的关系到类定义的外面. 如果像下面这样写就会导致以后代码维护的困难:

def get_no_of_instances(cls_obj):return cls_obj.no_inst
class Kls(object):no_inst = 0def __init__(self):Kls.no_inst = Kls.no_inst + 1
ik1 = Kls()
ik2 = Kls()
print(get_no_of_instances(Kls))

输出:

2

@classmethod 
我们要写一个只在类中运行而不在实例中运行的方法. 如果我们想让方法不在实例中运行,可以这么做:

def iget_no_of_instance(ins_obj):return ins_obj.__class__.no_inst
class Kls(object):no_inst = 0def __init__(self):Kls.no_inst = Kls.no_inst + 1
ik1 = Kls()
ik2 = Kls()
print iget_no_of_instance(ik1)

输出

2

在Python2.2以后可以使用@classmethod装饰器来创建类方法.

class Kls(object):no_inst = 0def __init__(self):Kls.no_inst = Kls.no_inst + 1@classmethoddef get_no_of_instance(cls_obj):return cls_obj.no_inst
ik1 = Kls()
ik2 = Kls()
print ik1.get_no_of_instance()
print Kls.get_no_of_instance()

输出:

2
2

这样的好处是: 不管这个方式是从实例调用还是从类调用,它都用第一个参数把类传递过来. 
@staticmethod 
经常有一些跟类有关系的功能但在运行时又不需要实例和类参与的情况下需要用到静态方法. 比如更改环境变量或者修改其他类的属性等能用到静态方法. 这种情况可以直接用函数解决, 但这样同样会扩散类内部的代码,造成维护困难. 
比如这样:

IND = 'ON'
def checkind():return (IND == 'ON')
class Kls(object):def __init__(self,data):self.data = data
def do_reset(self):if checkind():print('Reset done for:', self.data)
def set_db(self):if checkind():self.db = 'new db connection'print('DB connection made for:',self.data)
ik1 = Kls(12)
ik1.do_reset()
ik1.set_db()

输出:

Reset done for: 12
DB connection made for: 12

如果使用@staticmethod就能把相关的代码放到对应的位置了.

IND = 'ON'
class Kls(object):def __init__(self, data):self.data = data@staticmethoddef checkind():return (IND == 'ON')def do_reset(self):if self.checkind():print('Reset done for:', self.data)def set_db(self):if self.checkind():self.db = 'New db connection'print('DB connection made for: ', self.data)
ik1 = Kls(12)
ik1.do_reset()
ik1.set_db()

输出:

Reset done for: 12
DB connection made for: 12

下面这个更全面的代码和图示来展示这两种方法的不同 
@staticmethod 和 @classmethod的不同

class Kls(object):def __init__(self, data):self.data = datadef printd(self):print(self.data)@staticmethoddef smethod(*arg):print('Static:', arg)@classmethoddef cmethod(*arg):print('Class:', arg)
>>> ik = Kls(23)
>>> ik.printd()
23
>>> ik.smethod()
Static: ()
>>> ik.cmethod()
Class: (<class '__main__.Kls'>,)
>>> Kls.printd()
TypeError: unbound method printd() must be called with Kls instance as first argument (got nothing instead)
>>> Kls.smethod()
Static: ()
>>> Kls.cmethod()
Class: (<class '__main__.Kls'>,)

Python必知必会:Classethod与Staticmethod方法相关推荐

  1. Python 程序员必知必会的开发者工具

    Python 程序员必知必会的开发者工具 Python已经演化出了一个广泛的生态系统,该生态系统能够让Python程序员的生活变得更加简单,减少他们重复造轮的工作.同样的理念也适用于工具开发者的工作, ...

  2. c2064 项不会计算为接受0个参数的函数_【JS必知必会】高阶函数详解与实战

    本文涵盖 前言 高级函数概念 函数作为参数的高阶函数 map filter reduce sort详解与实战 函数作为返回值的高阶函数 isType函数与add求和函数 如何自己创建高阶函数 前言 一 ...

  3. MySQL必知必会教程:深入理解MySQL技术内幕

    2019独角兽企业重金招聘Python工程师标准>>> MySQL必知必会教程:深入理解MySQL技术内幕 作为最流行的开源数据库软件之一,MySQL数据库软件已经是广为人知了.当前 ...

  4. mysql必知必会_《MySQL必知必会》学习小结

    关于SQL,之前通过sqlzoo的题目,完成了入门,也仅仅是入门而已. 最近都在忙着投简历和找新的数据分析项目做(为了练python和面试的时候有的聊),所以SQL放了一段时间没练.目前的工作用不到, ...

  5. 关于conda和anaconda不可不知的误解和事实——conda必知必会

    2012年发布的跨平台包管理软件conda,是在数据分析界和Numpy和Scipy一样受欢迎的python工具.但是普通程序员平时只是会使用conda安装一些第三方包, 对它从哪里来,它是什么,和它要 ...

  6. tensorflow 按维度相加_人工智能 TensorFlow 必知必会编程概念整理

    内容概括: 学习 TensorFlow 编程模型的基础知识,重点了解以下概念: 张量 指令 图 会话 构建一个简单的 TensorFlow 程序,使用该程序绘制一个默认图并创建一个运行该图的会话 概念 ...

  7. asp sql ip地址排序_SQL必知必会读书笔记,30分钟入门SQL!

    点击上方SQL数据库开发,关注获取SQL视频教程 SQL专栏 SQL数据库基础知识汇总 SQL数据库高级知识汇总 来源:https://segmentfault.com/p/1210000011760 ...

  8. 风控成长之路---必知必会工具与业务

    关注 "番茄风控大数据",获取更多数据分析与风控大数据的实用干货. 偶然翻开多年前的笔记,当时踏入数据行业就是从人生的第一条select的代码开始.还好多年前做的笔记,网络云盘还为 ...

  9. 分享一个开源的项目,数据结构和算法必知必会的50个代码实现

    数据结构和算法必知必会的50个代码实现 这个开源项目是有前Google工程师打造出来的,使用了c,go,java,python,php等很多中语言实现了一些数据结构和算法,对于喜欢算法的来说可谓是一个 ...

  10. SQL必知必会-笔记(完善版):第1课

    文章目录 SQL必知必会 一.了解数据库 1.1 数据库基础 1.1.1 数据库 (补充)数据库管理系统: 注意1: 1.1.2 表 1.1.3 列和数据类型 1.1.4 行row 1.1.5 主键 ...

最新文章

  1. QIIME 2用户文档. 18使用q2-vsearch聚类OTUs(2018.11)
  2. 【Harvest源码分析】GetF0CandidateContour函数
  3. BZOJ Usaco 1616 Cow Travelling
  4. excel修改列名_听说你还在手动合并Excel,看看这个吧!?
  5. jquery获得下拉框的值
  6. 使用静态工厂方法而不是构造器
  7. Mr.J-- jQuery学习笔记(六)--attrprop方法
  8. component多个 vue_Vue.js之组件(component)
  9. POJ 1741 Tree(树的点分治)
  10. (可行方案)mysql5.7.9安装教程
  11. 程序员如何用代码彻底终结系统那些事儿?
  12. 【Android】-- adb shell 命令探索
  13. html运行flash脚本语言,flash课件制作常用的脚本语句
  14. python3爬虫实战一: 爬取豆瓣最新上映电影及画出词云分布
  15. ubuntu 16.04默认进入guest账户解决办法
  16. java gwt_java – 将GWT与Spring集成
  17. 蓝屏代码stop:0X000000EA(0X85E286B8,0X8635F210,0XF7A53CBC,0X00000001)NV4_DISP是什么意思?
  18. 几种常用的显示器分辨率
  19. IOS 制作app 预览视频
  20. C语言如何定义p1口,求助C51里如何实现P1口输入?置1了还没行哦。

热门文章

  1. linux回到上次目录与历史命令查找快捷方式
  2. 通过证书连接服务器的小命令
  3. 查看一个数是不是2的n次方
  4. 续上节,,基于App布局信息操作手机
  5. 从零开始一起学习SLAM | 相机成像模型
  6. 十九、python沉淀之路--装饰器
  7. Win7 + VS2015 + CMake3.6.1-GUI + Makefile 编译开源库
  8. Android解决异常apk on device '0292bea1': Unable to open sync connection!
  9. 哪些原因可能导致SQL操作操时呢?
  10. 关系分类 relation classification