1. class People(object):
  2. # 类属性是指定义在类的内部而且在方法的外部的属性
  3. money = 10000
  4.  
  5. def __init__(self,name,age,gender=1):
  6. # 对象属性是指定义在方法的内部的属性,例如本例中
  7. # name,age和gender都是对象属性
  8. self.name = name
  9. self.age = age
  10. self.gender = gender
  11.  
  12. # 创建两个类的对象
  13. student1 = People("张三",20)
  14. student2 = People("李四",25)
  15.  
  16. 类属性和对象属性的区别:
  17.  
  18. # 对象可以通过 对象名.属性名 调用对象属性和类属性
  19. print(student2.name)
  20. print(student2.money)#此时值为10000,为类的属性值.
  21. # 而类也可以通过 类名.属性名 调用类的属性,但是
  22. # 不能通过这种方式调用对象的属性
  23. # 例如类调用name属性,会报异常
  24. # AttributeError: type object 'People' has no attribute 'name'
  25. print(People.money)
  26.  
  27. print(People.name)
  1. # 在进行运算前这三个引用的都是类属性money
  2. # 所以这三个的属性money的内存地址都是相同的
  3. print(id(student1.money))
  4. print(id(student2.money))
  5. print(id(People.money)
  6.  
  7. # 进行如下的运算
  8. student1.money -= 1000
  9. People.money -= 1000
  10. # 再打印三者的内存地址
  11. print(id(student1.money))
  12. print(id(student2.money))
  13. print(id(People.money))

会发现student1引用的money属性的内存地址已经和另外两个的不一样了而另外两个的内存地址却还是一样的,原因如下:
在经过表达式student1.money -= 1000 的过程如下:第一次引用money属性时,经历的过程如下:会先在对象中查找是否有money这个属性,如果有的话,则直接进行运算如果没有,则会去类中查找是否有money属性,如果在类中找到money属性,那么student1就会创建一个对象属性money,在第二次调用的时候就会调用自己的对象属性,而不是类People中的属性了,而student2因为没有经过运算,所以不会创建自己的money属性,而是引用类People的属性,所以student2和People引用的还是同一个属性

  1. # 当student2进行同样的运算后,那么student2中也会创建一个money属性
  2. # 此时三者的money属性的内存地址都不一样了
  3. student2.money -= 1000
  4. print(id(student1.money))
  5. print(id(student2.money))
  6. print(id(People.money))

python-类属性和对象属性(转)的更多相关文章

  1. python类属性和对象属性、类的普通方法和静态方法

    类属性和对象属性的定义 class LearnClass(): #类属性 cls_attr = None def __init__(self,arg): #对象属性 self.obj_attr = a ...

  2. python类可以任意添加属性

    python类可以任意添加属性 class A(object): def __init__(self): self.name = "zhangsan" self.age = 18 ...

  3. python 类属性、对象属性

    类的普通属性: dir(Myclass), 返回一个key列表: Myclass.__dir__,返回一个字典: 1.类的数据属性: 2.类的方法: 类的特殊属性: 1.Myclass.__name_ ...

  4. 分别给Python类和实例增加属性和方法

    #定义一个类Student class Student(object): pass #给类增加一个属性name Student.name = 'xm' print Student.name # xm ...

  5. Python类总结-字段,方法,属性区别及StaticMethod, Property,私有字段和私有属性

    类包含下列 静态属性 动态属性 静态方法 动态方法 class Province: #静态字段--属于类,调用方法类.字段名 memo = "中国23个省之一" #动态字段--属于 ...

  6. python遍历并获取对象属性--dir(),__dict__,getattr,setattr

    一.遍历对象的属性: 1.dir(obj) :返回对象的所以属性名称字符串列表(包括属性和方法). for attr in dir(obj): print(attr) 2.obj.__dict__:返 ...

  7. python 类中的公有属性 私有属性 实例属性

    class parent(): i=1 __j=2 class child(parent): m=3 __n=4 def __init__(self,age,name): self.age=age s ...

  8. Python类,域,方法,对象,继承

    类和对象: 是面向对象编程的两个主要方面,类创建一个新类型,而对象这个类的实例.. 域: 属于一个对象或类的变量被称为域.域有两种类型: 属于每个实例(类的对象)或属于类本身.它们分别被称为实例变量和 ...

  9. JavaScript之面向对象的概念,对象属性和对象属性的特性简介

    一.大家都知道,面向对象语言有一个标志,那就是他们都有类的概念,通过类我们可以创建任意多个具有相同属性和方法的对象.但ECMAScript(指定JavaScript标准的机构,也就是说JavaScri ...

随机推荐

  1. Qt编写自定义控件1-汽车仪表盘

    前言 汽车仪表盘几乎是qt写仪表盘控件中最常见的,一般来说先要求美工做好设计图,然后设计效果图给到程序员,由程序员根据效果来实现,主要靠贴图,这种方法有个好处就是做出来的效果比较逼真,和真实效果图基本 ...

  2. gearman(异步计算)学习

    Gearman是什么? 它是分布式的程序调用框架,可完成跨语言的相互调 用,适合在后台运行工作任务.最初是2005年perl版本,2008年发布C/C++版本.目前大部分源码都是(Gearmand服务 ...

  3. 装饰模式和它在JDK中的实现

    对装饰者模式的一个通俗的理解就是:一个东西A包装了另外一个东西B,A在B的功能基础上又扩展了新的功能,但是对外提供的接口不变 装饰者模式(Decorator)的定义: 动态地给一个对象添加一些额外的职 ...

  4. print 与标准输出

    print会自动添加换行符 其它的,没什么区别.有时候为了使用灵活,才会这么用. 例如你想把print的内容写向一下log文件,你可以这么做 stdout_bk = sys.stdout #备份一下标 ...

  5. Android定时执行和停止某任务

    一.定义全局变量 int runCount = 0;// 全局变量,用于判断是否是第一次执行 Handler handlerCount = new Handler(); 二.创建Runnable Ru ...

  6. Db2性能:系统CPU高问题分析的一些思路

    Db2性能:系统CPU高问题分析的一些思路 1. 如何判断CPU高? 有很多操作系统的命令可以看出来,比如ps -elf,iostat, vmstat, top/topas, 2. 收集数据 CPU高 ...

  7. ML.NET速览

    什么是ML.NET? ML.NET是由微软创建,为.NET开发者准备的开源机器学习框架.它是跨平台的,可以在macOS,Linux及Windows上运行. 机器学习管道 ML.NET通过管道(pipe ...

  8. SQL server 清除缓存

    在进行性能分析的时候有时候需要清除缓存以便进行下一次分析. SQL Server提供了一些工具来清除缓存的性能数据.使用下面的语句来完成这些任务. 清除全局缓存使用下面的语句: DBCC DROPCL ...

  9. Vue2 dist 目录下各个文件的区别

    vue2 经过 2.2 版本升级后, 文件变成了 8 个: vue.common.js vue.esm.js vue.js vue.min.js vue.runtime.common.js vue.r ...

  10. angular 上传图像的使用总结

    AngularJS 的文件上传控件有两个:(1) angular-file-upload:https://github.com/nervgh/angular-file-upload(2) ng-fil ...