类变量

1、需要在一个类的各个对象间交互,即需要一个数据对象为整个类而非某个对象服务。
2、同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见。
3、有独立的存储区,属于整个类。
 
在python中是这样使用的:
class MyClass():
cls_count = 0

实例变量

1、当一个类实例化成特定对象后,在该对象命名空间的变量,只有该实例对象可以访问修改
在python中是这样使用的:
class MyClass():
def __init__(self):
self.count = 0
 
cls:python中约定成俗的代表类本身的变量
self:python中约定成俗的代表类实例本身的变量
 
classmethod
python中的语法糖,将一个方法定义在一个类的命令空间中,可以通过cls访问类变量,但不能访问实例变量
 
staticmethod
python中的语法糖,将一个方法定义在一个类的命名空间中,
和类方法差别不大,他们的主要差别是在类方法内部的时候,类方法可以有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 概念与区别的更多相关文章

  1. Java——静态变量/方法与实例变量/方法的区别

    静态只能调用静态 非静态: 对象名.方法名 package ti; //通过两个类 StaticDemo.LX4_1 说明静态变量/方法与实例变量/方法的区别. class StaticDemo { ...

  2. python @staticmethod @classmethod self cls方法区别

    一直在用这些东西,但是又从来没有总结过,正好今日想起来就总结一下这些东西 @staticmethod 静态方法,名义上归属类管理,不能使用类变量和实例变量,类的工具包放在函数前,不能访问类属性和实例属 ...

  3. python 类中staticmethod,classmethod,普通方法

    1.staticmethod:静态方法和全局函数类似,但是通过类和对象调用. 2.classmethod:类方法和类相关的方法,第一个参数是class对象(不是实例对象).在python中class也 ...

  4. 第8.12节 Python类中使用__dict__定义实例变量和方法

    上节介绍了使用实例的__dict__查看实例的自定义属性,其实还可以直接使用__dict__定义实例变量和实例方法. 一. 使用__dict__定义实例变量 语法: 对象名. dict[属性名] = ...

  5. Python 类变量 实例变量

    类变量: ​ 是可在类的所有实例之间共享的值(也就是说,它们不是单独分配给每个实例的).例如下例中,num_of_instance 就是类变量,用于跟踪存在着多少个Test 的实例. 实例变量: 实例 ...

  6. staticmethod classmethod property方法

    @staticmethod 静态方法 函数修饰符,用来修饰一个函数,类似于装饰器 class Dog(object): def __init__(self,name): self.name = nam ...

  7. python_94_类变量实例变量

    class Role: n=123#类变量 name='我是类name' list=[] def __init__(self,name,role,weapon,life_value=100,money ...

  8. class_copyIvarList方法获取实例变量问题引发的思考

    在runtime.h中,你可以通过其中的一个方法来获取实例变量,那就是class_copyIvarList方法,具体的实现如下: - (NSArray *)ivarArray:(Class)cls { ...

  9. python子类如何继承父类的实例变量?

    类型1:父类和子类的实例变量均不需要传递 class A(object): def __init__(self): self.name = "cui" def get_name(s ...

随机推荐

  1. 半透明全屏蒙层+全屏屏蔽+内容居中+css

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. SQL2008 2机镜像

    清除设置 //删除端点 declare @sql varchar() declare @mirrName varchar() select @mirrName=name from sys.databa ...

  3. 怎样导入现有的NiosII工程

    查找路径

  4. AngularJS实战之ng-repeat的详细用法

    一.基本语法 {{$index}}:获取元素的下标. {{$first}}:判断当前元素是否是第一个元素,是则为true,否则:false: {{$last}}:判断当前元素是否是最后一个元素,是则为 ...

  5. SecureCRTv7.3 和 navicat110_mysql

    激活步骤: 一.首次使用: 1.保持SecureCRT未打开. 2.打开注册机keygen.exe文件(Windows vista ,7,8需要以管理员身份运行),点击[Patch]按钮,会让你选择文 ...

  6. C++编译器详解(三)函数调用的区别:_cdecl以及_stdcall

    1._stdcall是Pascal程序的缺省调用方式,通常用于Win32 API中,函数采用从右到左的压栈方式,自己在退出时清空堆栈.VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上&qu ...

  7. split(),reverse(),join()

     split() 通过把字符串分割成子字符串来把一个 String 对象分割成一个字符串数组. str.split([separator][, limit])示例: "Webkit Moz ...

  8. android-基础编程-democoderjoy-架构篇

    设计这个demo很简单,针对每个控件放到一个listitem中去,主activity继承之listActivity,这样再override其单击效果进入到每个控件. 主界面流程 1.继承 MainAc ...

  9. python-Django-01基础配置

    参考资料地址 http://www.ziqiangxuetang.com/django/django-install.html 官方文档 一: 1先下载Django源码包,下载地址https://ww ...

  10. java基本语法、标识符、关键字

    基本语法 编写Java程序时,应注意以下几点: 大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的. 类名:对于所有的类来说,类名的首字母应该大写.如果类名由若干单词组 ...