【写在前面】

  本帖归属于装饰器单元的学习,可以点击关键词‘装饰器’查看其他博文讲解

【正文部分】

  说到装饰器一开始我觉得很陌生,看了一下别人的博客讲解,原来以前学习遇到的静态方法@staticmethod和类方法@classmethod就是一种python内置装饰器。那就开始讲讲Python中的方法。

  python中常见的方法有:静态方法(staticmethod)、类方法(classmethod)和实例方法,如下:

# 备注:下面给出的是四个方法,从上到下依次是:一般函数(不能算方法),实例化方法、类方法、静态方法
def foo(x):
print "executing foo(%s)"%(x) class A(object):
def foo(self,x):
print "executing foo(%s,%s)"%(self,x) @classmethod
def class_foo(cls,x):
print "executing class_foo(%s,%s)"%(cls,x) @staticmethod
def static_foo(x):
print "executing static_foo(%s)"%x a=A()

  这里先理解下函数参数里面的self和cls:这个self和cls是对实例和类的绑定。

  1、对于一般的函数来说我们可以这么调用foo(x),这个函数就是最常用的,它的工作跟任何东西(类,实例)无关.

  2、对于实例方法,我们知道在类里每次定义方法的时候都需要绑定这个实例,就是foo(self, x),为什么要这么做呢?因为实例方法的调用离不开实例,我们需要把实例自己传给函数,调用的时候是这样的a.foo(x)(其实是foo(a, x)).

  3、类方法一样,只不过它传递的是类而不是实例,A.class_foo(x). 注意这里的self和cls可以替换别的参数,但是python的约定是这俩,还是不要改的好.

  对于静态方法@staticmethod 其实和普通的方法一样,不需要对谁进行绑定,唯一的区别是调用的时候需要使用a.static_foo(x)或者A.static_foo(x)来调用.

  常见的3中方法对比如下:

  

【写在最后】

  这里作个小结:

  1、静态方法@staticmethod只在内存中生成一个,节省开销。

>>> c1.static = C.static
>>> c1.static is C.static
True
>>> c1.nostatic is C.nostatic
False
>>> c1.static
<function C.static at 0x000001BEEE1EC2F0>
>>> c2.static
<function C.static at 0x000001BEEE1EC2F0>
>>> C.static
<function C.static at 0x000001BEEE1EC2F0>

  2、实例化方法的实例对象都拥有独立的一个ID,开销较大。

>>> c1.nostatic
<bound method C.nostatic of <__main__.C object at 0x000001BEF0611E10>>
>>> c2.nostatic
<bound method C.nostatic of <__main__.C object at 0x000001BEF06337F0>>
>>> C.nostatic
<function C.nostatic at 0x000001BE

 

博主尊重原创,也支持原创,如有侵权,联系博主删帖,转帖请注明出处!

浅尝装饰器-@staticmethod 和@classmethod的更多相关文章

  1. 浅尝装饰器和AOP

    [写在前面] 参考文章:https://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html[从简单的例子入手进行讲解,由浅入深,很到位] 装饰器部 ...

  2. 浅尝装饰器--property装饰器

    [写在前面] 本帖归属于装饰器单元的学习,可以点击关键词'装饰器'查看其他博文讲解 [正文部分] property属性:将类方法用类属性的形式进行调用 class Good: def __init__ ...

  3. 第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法

    第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法 上节介绍了Python中类的静态方法,本节将结合案例详细说明相关内容. 一.    案例说明 本节定义了类Sta ...

  4. 第7.17节 Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析

    第7.17节  Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析 静态方法也是通过类定义的一种方法,一般将不需要访问类属性但是类需要具有的一些能力可以静态方法提供. 一 ...

  5. 浅谈装饰器(Python)

    先来了解函数和执行函数在python的区别   我再重新定义一个函数,在函数前面加上@set_func 执行结果如下:   函数前面没有加@set_fun 执行结果如下:   是不是可以不修改原来的函 ...

  6. 内置装饰器一:@classmethod、@staticmathod

    使用 @classmethod 和 @staticmathod 后,类的方法的调用 一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法. 而使用@staticmethod或@classmet ...

  7. Python之浅谈装饰器

    目录 闭包函数 装饰器 迭代器 闭包函数 就是将原先需要调用好几遍的函数和参数写入一个包内,下次调用时一起调用 def name(x): x=1 def age(): print(x) return ...

  8. 三个面向对象相关的装饰器@property@staticmathod@classmethod

    @property 先看实例: from math import pi class Circle: def __init__(self,r): self.r = r @property def per ...

  9. django中@property装饰器的运用

    python提供的内置装饰器——staticmethod.classmethod和property 在OSQA中,@property的使用频率是非常高的.下面就是它的使用方法: @property 可 ...

随机推荐

  1. Servlet 之文件下载

    Servlet 之文件下载 import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; impor ...

  2. RHEL7.2系统下的软件管理(yum)、本地yum源和网络yum源的搭建

    在Liunx系统中,rpm和yum都可以安装软件,但rpm存在安装软件的依赖性,yum安装软件需要yum源 1.yum yum install softwarename ##安装 yum repoli ...

  3. python使用pip安装模块出错 Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None))

    python使用pip安装模块出错 Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) 问题: ...

  4. 教你用multipass快速搭建k8s集群

    目录 前言 一.multipass快速入门 安装 使用 二.使用multipass搭建k8s集群 创建3台虚拟机 安装master节点 安装node节点 测试k8s集群 三.其他问题 不能拉取镜像:报 ...

  5. MongoDB(3)- Database 数据库相关

    Database MongoDB 将数据记录存储为文档(特别是 BSON 文档) 这些文档在集合中聚集在一起 数据库存储一个或多个文档集合. 在 MongoDB 里面存在数据库的概念,但没有模式 Sh ...

  6. Docker(42)- 镜像原理之联合文件系统

    前言 学习狂神老师的 Docker 系列课程,并总结 镜像是什么 镜像是一种轻量级.可执行的独立软件保,用来打包软件运行环境和基于运行环境开发的软件 他包含运行某个软件所需的所有内容,包括代码.运行时 ...

  7. 《openssl编程》:第一章基础知识

    第一章 基础知识 1.1 对称算法 对称算法使用一个密钥.给定一个明文和一个密钥,加密产生密文,其长度和明文大致相同.解密时,使用读密钥与加密密钥相同. 对称算法主要有四种加密模式: (1) 电子密码 ...

  8. 并发容器之ConcurrentMap

    一.concurentMap 1.数据结构,分段数组segment不扩容,里面的table扩容,每次翻倍,table中放的是entry链表的头地址: 2.初始化 segment和table的长度都是2 ...

  9. [CVE-2020-1956] Apache Kylin远程命令执行漏洞复现

    Apache Kylin是一个开源的.分布式的分析型数据仓库,提供Hadoop/Spark之上的 SQL 查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由 eBay 开发并贡献至开源社区. ...

  10. IIS中配置WCF站点

    http://msdn.microsoft.com/zh-cn/library/aa751852.aspx http://blog.csdn.net/hsg77/article/details/389 ...