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方法
接口类 接口类:是规范子类的一个模板,只要接口类中定义的,就应该在子类中实现接口类不能被实例化,它只能被继承支持多继承接口隔离原则:使用多个专门的接口,而不使用单一的总接口.即客户端不应该依赖那些不需 ...
随机推荐
- NUC970 Linux CAN 驱动问题及解决办法之一
开发平台介绍: NUC970 + 内置CAN控制器(双通道CAN1\CAN2) + 官方Linux_Kernel(少量修改) 名词: 版本A,问题及修改涉及两个版本,其中最旧版本称为版本A 版本B,问 ...
- chkconfig 系统服务管理
chkconfig --list 显示当前运行的所有服务/etc/inittabnetstat -antl all n端口 t tcp协议 l listen状态chkconfig --add ...
- java8之Metaspace
HotSpot JVM是java中最常用的java虚拟机.在java8 HotSpot JVM 中,虚拟机的内存模型做了修改调整.以前HotSpot JVM的内存模型分为新生代,老年代,永久 ...
- 关于EZDML数据库表结构制作设计工具使用踩的坑
我使用的是一款EZDML的数据库表结构制作设计工具 最开始在数据库创建数据库名为personalmall,基字符集为默认,数据库排序规则也是默认,创建完成之后 去EZDML生成SQL 点击执行sql ...
- login.exp
#!/usr/bin/expect ] ] ] ] spawn ssh -p $user@$host expect { "*yes/no*" {send "yes\r&q ...
- python自动华 (十)
Python自动化 [第十篇]:Python进阶-多进程/协程/事件驱动与Select\Poll\Epoll异步IO 本节内容: 多进程 协程 事件驱动与Select\Poll\Epoll异步IO ...
- Group by,并汇总求和
static void Main(string[] args) { bbb(); Console.ReadKey(); } public static List<Dto> toAdd() ...
- [Luogu P1658] 购物
题目链接 这道题的主要思想是贪心. 题目的要求用几个硬币将1~x的数都能够凑出的最少硬币个数.这里注意一下是都凑出而不是同时凑出. 先讨论什么时候无解.所有的自然数都可以用1堆砌而成.换而言之只要有1 ...
- 002_UCOSIII任务创建于删除
(一)先创建一个启动任务来进行创建其它任务,创建任务的宏定义 #define START_TASK_PRIO 3 //任务优先级 #define START_STK_SIZE 128 //任务堆栈大小 ...
- 获取select框下option所有值
document.getElementById('roomId').options[0].value;获取第一个值 var roomIds = $("#roomId option" ...