python3 @classmethod 和 @staticmethod 的区别
如果您将某个东西定义为classmethod,这可能是因为您打算从类而不是类实例中调用它。
定义类方法的几种方式:
- 常规方式 : 需要self隐士传递当前类对象的实例。
- @classmethod 装饰器修饰 :需要通过cls参数传递当前类对象
- @staticmethod 装饰器修饰 :与普通函数是一样
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()
调用说明
#类中方法均可通过:对象实例.方法() 访问
a.foo() #executing foo(<__main__.A object at 0x0000000001E9B488>, )
a.class_foo() #executing class_foo(<class '__main__.A'>, )
a.static_foo() #executing static_foo() #@classmethod修饰方法调用: 类对象或对象实例调用
A.class_foo() #executing class_foo(<class '__main__.A'>, )
a.class_foo() #executing class_foo(<class '__main__.A'>, ) # 通过类对象 访问常规方法即没有修饰符的方法
A.foo(a,) #executing foo(<__main__.A object at 0x000000000284C488>, )
其他案例:
class A(object):
def __init__(self,name):
self.name = name def foo(self, x):
print("executing foo(%s, %s, %s)" % (self, x,self.name)) @classmethod
def class_foo(cls, x):
print("executing class_foo(%s, %s)" % (cls, x))
# 返回一个实例对象
return cls(x) @staticmethod
def static_foo(x):
print("executing static_foo(%s)" % x) dd = A.class_foo(2) # executing class_foo(<class '__main__.A'>, 2)
print(dd.name) #
dd.foo(3) # executing foo(<__main__.A object at 0x0000000001E8B708>, 3, 2)
class CeShi:
name = '测试'
def __init__(self,x,y):
self.x = x
self.y = y @property #在CeShi_add函数前加上@property,使得该函数可直接调用,封装起来
def CeShi_add(self):
return self.x + self.y #在CeShi_info函数前加上@classmethon,则该函数变为类方法,
@classmethod #该函数只能访问到类的数据属性,不能获取实例的数据属性
def CeShi_info(cls): #python自动传入位置参数cls就是类本身
print('这是一个%s'%cls.name) #cls.CeShi_name调用类自己的数据属性 CeShi.CeShi_info()
python3 @classmethod 和 @staticmethod 的区别的更多相关文章
- python classmethod 和 staticmethod的区别
https://stackoverflow.com/questions/12179271/meaning-of-classmethod-and-staticmethod-for-beginner 1. ...
- python 3全栈开发-面向对象之绑定方法(classmethod与staticmethod的区别)、多态、封装的特性property
一.面向对象绑定方法 一.类中定义的函数分成两大类 1.绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入): 1. 绑定到类的方法:用classmethod装饰器装饰的方法. 为类量身定制 ...
- Python中的实例方法、classmethod和staticmethod的区别
class NewsPaper(object): # 类属性 __print_times = 0 # 下划线表示私有属性 # 实例方法 def __init__(self, title, conten ...
- Python中classmethod和staticmethod的区别
学习python中经常会出现一些相近或者相似的语法模块等,需要对比分析才能加深记忆,熟练运用. staticmethod:静态方法 classmethod:类方法 在python中,静态方法和类方法都 ...
- 洗礼灵魂,修炼python(47)--巩固篇—定义类的方法之@classmethod,@staticmethod
定义类的方法,相信你会说,不就是在class语句下使用def () 就是定义类的方法了嘛,是的,这是定义的方法的一种,而且是最普通的方式 首先,我们已经知道有两种方式: 1.普通方法: 1)与类无关的 ...
- python @classmethod和@staticmethod区别
python 类方法和静态方法区别 python @classmethod和@staticmethod区别 Python中至少有三种比较常见的方法类型,即实例方法,类方法.静态方法.它们是如何定义的呢 ...
- python的@classmethod和@staticmethod
本文是对StackOverflow上的一篇高赞回答的不完全翻译,原文链接:meaning-of-classmethod-and-staticmethod-for-beginner Python面向对象 ...
- Fluent Python: Classmethod vs Staticmethod
Fluent Python一书9.4节比较了 Classmethod 和 Staticmethod 两个装饰器的区别: 给出的结论是一个非常有用(Classmethod), 一个不太有用(Static ...
- 面向对象封装 classmethod和staticmethod方法
接口类 接口类:是规范子类的一个模板,只要接口类中定义的,就应该在子类中实现接口类不能被实例化,它只能被继承支持多继承接口隔离原则:使用多个专门的接口,而不使用单一的总接口.即客户端不应该依赖那些不需 ...
随机推荐
- sql/pl 安装并连接Oracle数据库
1,首先,先下载pl/sql devloper 安装包.下载对应版本的安装包 下载地址 https://www.allroundautomations.com/bodyplsqldevreg.htm ...
- Python基础之异常
一.摘要 Python使用被称为异常 的特殊对象来管理程序执行期间发生的错误.每当发生让Python不知所措的错误时,它都会创建一个异常对象.如果你编写了处理该异常的代码,程序将继续运行:如果你未对异 ...
- Java 基础 面向对象: 接口(interface )概念 以及接口之练习3 -定义一个接口用来实现两个对象的比较并 判断instanceof是否为同类
接口(interface )概念概念笔记 及测试代码: /** 面向对象: 接口(interface ) 是与类并行的一个概念: * 1.接口可以看成一个特殊的抽象类,它是常量与抽象方法的一个集合 * ...
- ubuntu下编辑文本命令
常见的基于控制台的文本编辑器有以下几种: emacs 综合性的GNU emacs 编辑环境 nano 一个类似于经典的pico的文本编辑器,内置了一个pi ...
- Java并发包--ConcurrentLinkedQueue
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3498995.html ConcurrentLinkedQueue介绍 ConcurrentLinkedQ ...
- GC详解及Minor GC和Full GC触发条件
GC,即就是Java垃圾回收机制.目前主流的JVM(HotSpot)采用的是分代收集算法.与C++不同的是,Java采用的是类似于树形结构的可达性分析法来判断对象是否还存在引用.即:从gcroot开始 ...
- 百度ueditor中复制word图文时图片转存任然保持灰色不可用
官网地址http://ueditor.baidu.com Git 地址 https://github.com/fex-team/ueditor 参考博客地址 http://blog.ncmem.com ...
- mkswap/swapon/swapoff/free
free mkswap 创建Linux交换分区 swapon 启用交换分区 swapoff 关闭交换分区 注意: 在创建完交换区之后.是需要激活才能使用的 swapon/swapoff
- kill/xkill/killall/pkill/pidof
pidof 杀死进程的关键是找到进程id,杀错进程id是异常灾难, 使用ps -ef|grep 可以查看到相关进程的pid及ppid 可以直接kill掉ppid,其子进程也都会被杀死 也可以使用pid ...
- Codeforces.520B.Two Buttons(正难则反)
题目链接 \(Description\) 给定两个数\(n,m\),每次可以使\(n\)减一或使\(n\)乘2.求最少需要多少次可以使\(n\)等于\(m\). \(Solution\) 暴力连边BF ...