Python staticmethod classmethod 普通方法 类变量 实例变量 cls self 概念与区别
类变量
class MyClass():
cls_count = 0
实例变量
class MyClass():
def __init__(self):
self.count = 0
cls的类引用,静态访问则没有,如果静态方法想使用类变量,只能硬编码类名class demo():
cls_count = 0 def __init__(self):
self.count = 0
print self, ' instance is created' @classmethod
def cls_add_class_count(cls):
print 'classmethod before: demo count is: ', cls.cls_count
cls.cls_count = cls.cls_count + 1
print 'classmethod after: demo count is: ', cls.cls_count @staticmethod
def static_add_class_count():
print 'staticmethod before: demo count is: ', demo.cls_count
demo.cls_count = demo.cls_count + 1
print 'staticmethod after: demo count is: ', demo.cls_count def instance_add_class_count(self):
print 'instance befor: demo count is: ', self.cls_count
self.cls_count = self.cls_count + 1
print 'instance after: demo count is: ', self.cls_count def instance_add_instance_count(self):
print 'instance befor: instance count is: ', self.count
self.count = self.count + 1
print 'instance after: instance count is: ', self.count if __name__ == '__main__':
d1 = demo()
d2 = demo()
print 'call classmethod'
d1.cls_add_class_count()
d2.cls_add_class_count()
print demo.cls_count
print '----------------'
print 'call staticmethod'
print 'staticmethod'
d1.static_add_class_count()
d2.static_add_class_count()
print demo.cls_count
print '----------------'
print 'call instance add class count method'
d1.instance_add_class_count()
d2.instance_add_class_count()
print '----------------'
print 'call instance add instance count method'
d1.instance_add_instance_count()
d2.instance_add_instance_count()
输出为:
<__main__.demo instance at 0x00000000022A9B48> instance is created
<__main__.demo instance at 0x00000000022A9B88> instance is created
call classmethod
classmethod before: demo count is: 0
classmethod after: demo count is: 1
classmethod before: demo count is: 1
classmethod after: demo count is: 2
2
----------------
call staticmethod
staticmethod
staticmethod before: demo count is: 2
staticmethod after: demo count is: 3
staticmethod before: demo count is: 3
staticmethod after: demo count is: 4
4
----------------
call instance add class count method
instance befor: demo count is: 4
instance after: demo count is: 5
instance befor: demo count is: 4
instance after: demo count is: 5
----------------
call instance add instance count method
instance befor: instance count is: 0
instance after: instance count is: 1
instance befor: instance count is: 0
instance after: instance count is: 1
总结
1 staticmethod,classmethod和实例方法都可以访问到类变量,但是,staticmethod通过类名访问,classmethod通过传入的cls访问,两者
都直接通过类本身直接调用。而实例方法需要类实例化,先在实例变量中查找,如果找不到,再到类变量中访问。
2 也就是说实例方法可以实现staticmethod和classmethod的效果,但是使用staticmethod和classmethod可以从代码上直接说明该方法的作用
Python staticmethod classmethod 普通方法 类变量 实例变量 cls self 概念与区别的更多相关文章
- Java——静态变量/方法与实例变量/方法的区别
静态只能调用静态 非静态: 对象名.方法名 package ti; //通过两个类 StaticDemo.LX4_1 说明静态变量/方法与实例变量/方法的区别. class StaticDemo { ...
- python @staticmethod @classmethod self cls方法区别
一直在用这些东西,但是又从来没有总结过,正好今日想起来就总结一下这些东西 @staticmethod 静态方法,名义上归属类管理,不能使用类变量和实例变量,类的工具包放在函数前,不能访问类属性和实例属 ...
- python 类中staticmethod,classmethod,普通方法
1.staticmethod:静态方法和全局函数类似,但是通过类和对象调用. 2.classmethod:类方法和类相关的方法,第一个参数是class对象(不是实例对象).在python中class也 ...
- 第8.12节 Python类中使用__dict__定义实例变量和方法
上节介绍了使用实例的__dict__查看实例的自定义属性,其实还可以直接使用__dict__定义实例变量和实例方法. 一. 使用__dict__定义实例变量 语法: 对象名. dict[属性名] = ...
- Python 类变量 实例变量
类变量: 是可在类的所有实例之间共享的值(也就是说,它们不是单独分配给每个实例的).例如下例中,num_of_instance 就是类变量,用于跟踪存在着多少个Test 的实例. 实例变量: 实例 ...
- staticmethod classmethod property方法
@staticmethod 静态方法 函数修饰符,用来修饰一个函数,类似于装饰器 class Dog(object): def __init__(self,name): self.name = nam ...
- python_94_类变量实例变量
class Role: n=123#类变量 name='我是类name' list=[] def __init__(self,name,role,weapon,life_value=100,money ...
- class_copyIvarList方法获取实例变量问题引发的思考
在runtime.h中,你可以通过其中的一个方法来获取实例变量,那就是class_copyIvarList方法,具体的实现如下: - (NSArray *)ivarArray:(Class)cls { ...
- python子类如何继承父类的实例变量?
类型1:父类和子类的实例变量均不需要传递 class A(object): def __init__(self): self.name = "cui" def get_name(s ...
随机推荐
- 2018.11.06 NOIP训练 简单的计数问题(计数dp)
传送门 直接f[i][j]f[i][j]f[i][j]表示已经到第iii个位置已经找到jjj个的方案数. 简单转移一下就行了. 代码
- 2018.11.02 NOIP训练 停车场(线段树)
传送门 这是一道困饶了我一年的题. 其实就是去年去NOIP提高组试水的时候考的模拟题 但当时我水平不够,跟ykykyk一起杠了一个下午都没调出来. 今天终于AAA了. 其实就是一个维护最长连续0101 ...
- Codeforces Round #523 (Div. 2) F. Katya and Segments Sets (交互题+思维)
https://codeforces.com/contest/1061/problem/F 题意 假设存在一颗完全k叉树(n<=1e5),允许你进行最多(n*60)次询问,然后输出这棵树的根,每 ...
- Linq高级应用
Linq的应用为我们带来了很大的方便,提高了coding效率,最近看到了一个用linq写的数独游戏算法,让我看到了Linq写的是如此优雅,耳目一新的感觉,以前没有写过这样的代码,同时也感觉到原来Lin ...
- BZOJ 2440 [中山市选2011]完全平方数 (二分 + 莫比乌斯函数)
2440: [中山市选2011]完全平方数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 4805 Solved: 2325[Submit][Sta ...
- oracle死锁解决方法
select SESS.sid, SESS.SERIAL#, LO.ORACLE_USERNAME, LO.OS_USER_NAME, AO.OBJECT_NAME, LO.LOCKED_M ...
- js, javascript 图片懒加载 实例代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- java 块语句 和引用类型
1.java中存在块语句,块语句分为四种 1.静态块 2.普通块 3.构造块 4.同步块 静态块的执行时机是在class文件装载的时候;静态块只会执行一次, 多个静态块的时候,按出现顺序执行,存放类的 ...
- 25个Linux相关的网站
下面是25个最具有影响力,也是最重要的Linux网站,这些网站提供了Linux的分发包,软件,文件,新闻,以及其它所有的关于Linux的东西.关于Linux的分发包历史,可以看看本站的这篇文章< ...
- Forward团队-爬虫豆瓣top250项目-设计文档
组长地址:http://www.cnblogs.com/mazhuangmz/p/7603594.html 成员:马壮,李志宇,刘子轩,年光宇,邢云淇,张良 设计方案: 1.能分析HTML语言: 2. ...