引言:

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

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

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

>>>
>>> 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. pandas.read_csv 参数 index_col=0

    index_col : int or sequence or False, default None 用作行索引的列编号或者列名,如果给定一个序列则有多个行索引. 如果文件不规则,行尾有分隔符,则可以 ...

  2. CTF之常见的两种关于word的信息隐藏技术

    一.利用word本身自带的文字隐藏功能 1.在word中输入文字 2.选中文字,单击右键,选择字体选项 3.单击字体选项后,单击隐藏,确定 查找隐藏信息 1.单击左上角WPS文字后,选择选项按钮单击 ...

  3. 【MVC】使用MvcPager进行分页

    1.添加引用: mvcPager 版本高的提供的功能也更多. 注:下载了第一个,但是里面的一些字段是只读的.(eg:PagedList<T> .TotalItemCount)这是不符合的. ...

  4. jquery,从后台查数据,给页面上添加树形。

    前台jquery+ajax请求往页面上添加树形的js代码 //传入当前点击节点的id,在后台代码查询出parentid=当前节点id的记录数,从而实现点击当前节点,往后台发送ajax请求,查询出子节点 ...

  5. pandas 里面对nan的判断

    不要用math.isnan() pandas里专门有一个函数: age_null = pd.isnull(titanic_survival[‘age’])

  6. Android和Linux下设备节点的创建笔记

    1. Linux kernel创建的/dev/下的设备节点是不对的, 其实是kernel仅负责在/sys/(基于内存的虚拟文件系统)创建一大堆下目录和文件,而真正的设备节点是在用户空间程序创建的,应该 ...

  7. Oracle 跨库 查询 复制表数据

    在目前绝大部分数据库有分布式查询的需要.下面简单的介绍如何在oracle中配置实现跨库访问. 比如现在有2个数据库服务器,安装了2个数据库.数据库server A和B.现在来实现在A库中访问B的数据库 ...

  8. TortoiseSVN使用步骤和trunk,Branch,Tag详细说明

    1 安装及下载client 端 2 什么是SVN(Subversion)? 3 为甚么要用SVN? 4 怎么样在Windows下面建立SVN Repository? 5 建立一个Working目录 6 ...

  9. 常用C库函数功能及用法

    二.字符函数 调用字符函数时,要求在源文件中包下以下命令行: #include <ctype.h> 函数原型说明 功能 返回值 int isalnum(int ch) 检查ch是否为字母或 ...

  10. 【python】class之类属性

    class Foo(object): x=1.5 foo=Foo() print foo.x#通过实例访问类属性 >>>1.5 print Foo.x #通过类访问类属性 >& ...