浅尝装饰器-@staticmethod 和@classmethod
【写在前面】
本帖归属于装饰器单元的学习,可以点击关键词‘装饰器’查看其他博文讲解
【正文部分】
说到装饰器一开始我觉得很陌生,看了一下别人的博客讲解,原来以前学习遇到的静态方法@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的更多相关文章
- 浅尝装饰器和AOP
[写在前面] 参考文章:https://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html[从简单的例子入手进行讲解,由浅入深,很到位] 装饰器部 ...
- 浅尝装饰器--property装饰器
[写在前面] 本帖归属于装饰器单元的学习,可以点击关键词'装饰器'查看其他博文讲解 [正文部分] property属性:将类方法用类属性的形式进行调用 class Good: def __init__ ...
- 第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法
第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法 上节介绍了Python中类的静态方法,本节将结合案例详细说明相关内容. 一. 案例说明 本节定义了类Sta ...
- 第7.17节 Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析
第7.17节 Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析 静态方法也是通过类定义的一种方法,一般将不需要访问类属性但是类需要具有的一些能力可以静态方法提供. 一 ...
- 浅谈装饰器(Python)
先来了解函数和执行函数在python的区别 我再重新定义一个函数,在函数前面加上@set_func 执行结果如下: 函数前面没有加@set_fun 执行结果如下: 是不是可以不修改原来的函 ...
- 内置装饰器一:@classmethod、@staticmathod
使用 @classmethod 和 @staticmathod 后,类的方法的调用 一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法. 而使用@staticmethod或@classmet ...
- Python之浅谈装饰器
目录 闭包函数 装饰器 迭代器 闭包函数 就是将原先需要调用好几遍的函数和参数写入一个包内,下次调用时一起调用 def name(x): x=1 def age(): print(x) return ...
- 三个面向对象相关的装饰器@property@staticmathod@classmethod
@property 先看实例: from math import pi class Circle: def __init__(self,r): self.r = r @property def per ...
- django中@property装饰器的运用
python提供的内置装饰器——staticmethod.classmethod和property 在OSQA中,@property的使用频率是非常高的.下面就是它的使用方法: @property 可 ...
随机推荐
- 重启网络服务 network 出现问题
2021-08-24 地址冲突了,因为想要设置成静态 ip 一直都不对,情急之下就将本地 ip 设置成了虚拟机的 ip,故出现此错误 后将地址改掉,重启网络服务就没有错误了 一开始我设置的虚拟网卡 n ...
- Python语法之函数、引用和装饰器
所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用 函数是带名字的代码块,用于完成具体的工作 需要在程序中多次执行同一项任务时,你无需反复编写完成该任务的代码,而只需调用该 任务 ...
- AWS扩容EC2实例根空间
文章原文 aws 端操作 先在EC2 实例中选中磁盘 然后打开跟设备 修改大小后保存 ec2 端操作 lsblk 查看当前设备的磁盘编号 df -T -H 查看扩容前的空间大小并确定磁盘格式 grow ...
- VS Code 搭建stm32开发环境
MCU免费开发环境 一般芯片厂家会提供各种开发IDE方案,通常其中就包括其自家的集成IDE,如: 意法半导体 STM32CubeIDE NXP Codewarrior TI CCS 另外也可以用ecl ...
- 异步处理方式之信号(一):基础知识和signal函数说明
文章目录 1. 引言 2. 信号的概念 2.1 信号操作之忽略信号 2.2 信号操作之捕捉信号 2.3 信号操作之执行系统默认操作 2.4 常见的信号 3. 函数signal 3.1 signal函数 ...
- Linux proc文件系统小记
序言: 当linux系统存在多个网口时(也可以是一个网口配置两个IP),每个网口配置不同的IP地址,并且分别连接到不同的电脑上,电脑分别配置与相连的网口统一网段的IP且将电脑网关设置为linux的网口 ...
- 动态路由——OSPF
目录: 一. OSPF路由协议概述 1,OSPF协议 2,内部网关协议和外部网关协议 3,OSPF的工作过程 二.OSPF基本概念 1,OSPF区域 2,区域ID 3,R ...
- kubectl工具的windows\linux安装方法
kubectl 安装 下载kubectl二进制文件 curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.10.0 ...
- 开源物联网平台(Thingsboard)-编译
环境准备 Jdk8+ (3.2.2版本开始使用Jdk11) Maven3.2.1+ release-3.2分支 获取代码 ##get source from mirror git clone http ...
- 解决wampserver无法启动问题
如果无法启动,找不到原因.直接依次点击打开到:控制面板--管理工具--事件查看器--windows日志--应用程序,查看对应进程错误信息对症下药即可. 我这个错误就是8099端口错误,运行cmd命令, ...