引言:

  使用不同的函数定义方法,可以使得函数定义更加有效而且易于维护

  本文为博主原创,根据本人自己的理解整理而成,若有不准确的地方,希望能留言告知以免误导他人;

  首先进一段代码,来直观感受一下不同类型的函数的定义方法:

>>>
>>> class A(object):
    a =
    def instance_method(self):
        print '实例方法打印类变量a: %s' % self.a
    @classmethod
    def class_method(cls):
        print '类方法打印类变量a: %s' % cls.a
    @staticmethod
    def static_method(b):
        print '静态方法打印自己的变量b: %s' % b

>>>
>>> A.instance_method()

Traceback (most recent call last):
  File , in <module>
    A.instance_method()
TypeError: unbound method instance_method() must be called with A instance as first argument (got nothing instead)
>>>
>>> A().instance_method()
实例方法打印类变量a:
>>>
>>> A.class_method()
类方法打印类变量a:
>>>
>>> A().class_method()
类方法打印类变量a:
>>>
>>> A.static_method()
静态方法打印自己的变量b:
>>>
>>> A().static_method()
静态方法打印自己的变量b:
>>>
>>> 

  解析一下以上代码:

  1.实例方法instance_method()的定义不需要声明,默认需要一个self参数作为第一个参数;在调用的时候这个self参数指代实例对象;由代码中的调用方式可以看出,实例方法不能用类对象调用,也就是A.instance_method()调用会报错;但是可以用实例对象A().instance_method()调用;当然如果不明确,可以写成:

      ins = A()

      ins.instance_method()

  2.类方法class_method()需要用装饰器@classmethod来声明,默认需要一个cls参数作为函数的第一个参数;在调用的时候这个cls参数指代类对象;这样定义的好处是不需要实例化类对象即可调用这个方法:A.instance_method();当然如果需要,类方法也可以通过实例对象调用:A().class_method();但是在大多别的变成语言中不允许实例对象调用类方法;类方法的调用在导入模块时能得到更好的体现:

      import A

      A.class_method()

  3.静态方法static_method()需要用装饰器@staticmethod来声明,理解静态变量的最好方法是把静态方法拿到类的外面,或者说重新再类的外面定义一个相同的函数来对比两者的区别;其实静态变量就是在类中定义的跟这个类没有关系的方法,它不引用类的变量,也跟类中的其他函数没有关联,完全自己玩自己的,所以能够看到在代码中定义静态变量的时候给了它自己的一个函数变量b,而它打印的也是自己的变量b;但是既然定义在类中,就得通过类对象或者实例对象来调用;

  另外,需要注意得是,实例方法和类方法中的self和cls这两个字符本身没有什么特殊,完全可以用别的字符如hello或者hi来代替,但是python中约定俗成默认用self和cls来作为实例方法和类方法的第一个参数,在调用方法时,self用来指代实例对象,cls用来指代类对象本身;静态方法因为本身与类中其他变量或者方法没有关联,所以不需要这样一个参数;

粗解python的@classmethod和@staticmethod及普通实例方法的更多相关文章

  1. python类方法@classmethod与@staticmethod

    目录 python类方法@classmethod与@staticmethod 一.@classmethod 介绍 语法 举例 二.@staticmethod 介绍 语法 举例 python类方法@cl ...

  2. python的@classmethod和@staticmethod

    本文是对StackOverflow上的一篇高赞回答的不完全翻译,原文链接:meaning-of-classmethod-and-staticmethod-for-beginner Python面向对象 ...

  3. Python中classmethod与staticmethod区别

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

  4. Python中classmethod和staticmethod的区别

    学习python中经常会出现一些相近或者相似的语法模块等,需要对比分析才能加深记忆,熟练运用. staticmethod:静态方法 classmethod:类方法 在python中,静态方法和类方法都 ...

  5. Python的classmethod和staticmethod区别

    静态方法(staticmethod) 类方法(classmethod) 静态方法和类方法都可以通过类名.方法名或者实例.方法访问. #-*- coding:utf8 -*- class A(objec ...

  6. python基础知识讲解——@classmethod和@staticmethod的作用

    python基础知识讲解——@classmethod和@staticmethod的作用 在类的成员函数中,可以添加@classmethod和@staticmethod修饰符,这两者有一定的差异,简单来 ...

  7. @classmethod及@staticmethod方法浅析【python】

    目前对于python中@classmethod 类方法和@staticmethod静态方法的有了一定的认识,之后有进一步的认识后继续记录. @classmethod :是和一个class类相关的方法, ...

  8. 洗礼灵魂,修炼python(47)--巩固篇—定义类的方法之@classmethod,@staticmethod

    定义类的方法,相信你会说,不就是在class语句下使用def () 就是定义类的方法了嘛,是的,这是定义的方法的一种,而且是最普通的方式 首先,我们已经知道有两种方式: 1.普通方法: 1)与类无关的 ...

  9. python基础-abstractmethod、__属性、property、setter、deleter、classmethod、staticmethod

    python基础-abstractmethod.__属性.property.setter.deleter.classmethod.staticmethod

随机推荐

  1. 20155237 2016-2017-2 《Java程序设计》第6周学习总结

    20155237 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 第十章 输入与输出 InputStream与OutputStream 流(Stream)是对 ...

  2. 关于FormData及其用法

    XMLHttpRequest Level 2添加了一个新的接口FormData.利用FormData对象,我们可以通过JavaScript用一些键值对来模拟一系列表单控件,我们还可以使用XMLHttp ...

  3. (2)bytes类型

    bytes类型就是字节类型 把8个二进制一组称为一个byte,用16进制来表示 Python2里面字符串其实更应该称为字节串,但是python2里面有一个类型是butes,所以在Python2里面by ...

  4. 【Quartz】Quartz的数据库表

    select * from test.QRTZ_TRIGGERS 触发器表 select * from QRTZ_PAUSED_TRIGGER_GRPS 暂停的分组任务表 select * from ...

  5. (1)集合 ---遍历map集合

    Map接口     实现Map接口的类用来存储键(key)-值(value) 对.Map 接口的实现类有HashMap和TreeMap等.Map类中存储的键-值对通过键来标识,所以键值不能重复. Ha ...

  6. 一张图解释java跨平台

  7. dbt 包依赖简单测试

    dbt 包含一个自己的包管理,可以使用git 等工具,还是很方便的,可以方便的进行代码共享,实现复用 创建简单包 实际上就是一个简单的dbt 项目,参考项目 https://gitlab.com/da ...

  8. 两个有用Oracle运算:intersect和minus运算

    intersect运算 返回查询结果中相同的部分 exp:各个部门中有哪些相同的工种 select job from account intersect select job from researc ...

  9. 关于 Vue 方法前面的美元符号

    关于 Vue 方法前面的美元符号 学到这一段,不明白什么意思,然后手贱把 $ 删除了,出现未定义方法. vm.$watch('counter', function(nval, oval) { aler ...

  10. 【转】Linux的五个查找命令:find,locate,whereis,which,type

    原文网址:http://www.ruanyifeng.com/blog/2009/10/5_ways_to_search_for_files_using_the_terminal.html 最近,我在 ...