类属性就是类对象所拥有的属性,它被所有类对象实例对象所共有,在内存中只存在一个副本,这个和C++中类的静态成员变量有点类似。对于公有的类属性,在类外可以通过类对象实例对象访问

类属性

class people:
name = 'Tom' #公有的类属性
__age = 12 #私有的类属性 p = people() print p.name #正确
print people.name #正确
print p.__age #错误,不能在类外通过实例对象访问私有的类属性
print people.__age #错误,不能在类外通过类对象访问私有的类属性

实例属性

实例属性是不需要在类中显示定义的,比如:

class people:
name = 'Tom' p = people()
p.age =12
print p.name #正确
print p.age #正确 print people.name #正确
print people.age #错误

在类外对类对象people进行实例化之后,产生了一个实例对象p,然后p.age = 12这句给p添加了一个实例属性age,赋值为12。这个实例属性是实例对象p所特有的,注意,类对象people并不拥有它(所以不能通过类对象来访问这个age属性)。当然还可以在实例化对象的时候给age赋值。

class people:
name = 'Tom' #__init__()是内置的构造方法,在实例化对象时自动调用
def __init__(self,age):
self.age = age p = people(12)
print p.name #正确
print p.age #正确 print people.name #正确
print people.age #错误

如果需要在类外修改类属性,必须通过类对象去引用然后进行修改。如果通过实例对象去引用,会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性

class people:
country = 'china' print people.country
p = people()
print p.country
p.country = 'japan'
print p.country #实例属性会屏蔽掉同名的类属性
print people.country
del p.country #删除实例属性
print p.country

总结

对于类属性和实例属性,如果在类方法中引用某个属性,该属性必定是类属性,而如果在实例方法中引用某个属性(不作更改),并且存在同名的类属性,此时若实例对象有该名称的实例属性,则实例属性会屏蔽类属性,即引用的是实例属性,若实例对象没有该名称的实例属性,则引用的是类属性;如果在实例方法更改某个属性,并且存在同名的类属性,此时若实例对象有该名称的实例属性,则修改的是实例属性,若实例对象没有该名称的实例属性,则会创建一个同名称的实例属性。想要修改类属性,如果在类外,可以通过类对象修改,如果在类里面,只有在类方法中进行修改。

最新文章

  1. Python模块和包
  2. hdu 1513
  3. 蓝牙的L2CAP协议
  4. Cloudera CDH 、Impala本地通过Parcel安装配置详解及什么是Parcel
  5. Java集合 List,Set,Map
  6. 几个Google中国的访问IP
  7. height、clientHeight、scrollHeight、offsetHeight区别
  8. 使用VisualSVN Server搭建SVN服务器(转载)
  9. 菜鸟学开店—自带U盘的打印机
  10. JS 节流阀
  11. jquery $.post
  12. 【NOIP2015提高组】跳石头
  13. 03安卓TextView
  14. Android开发技术周报176学习记录
  15. 【Spark调优】聚合操作数据倾斜解决方案
  16. python字符串的常用方法
  17. GMA Round 1 数列求和(Hard)
  18. Linux 防火墙:Netfilter iptables
  19. Could not find a package configuration file provided by "Sophus",SophusConfig.cmake
  20. BZOJ.3693.圆桌会议(Hall定理 线段树)

热门文章

  1. 使用所学Spring知识,实现简易的图书查询系统功能。实现查询全部图书。 根据书籍编号查询信息。 根据书名查询书籍信息。 根据状态查询书籍信息。
  2. 编写Java程序,使用菜单组件制作一个记事本编辑器
  3. 读取 properties 配置文件含有中文的value内容 导致中文乱码 的解决办法
  4. less 循环模拟sass的for循环效果
  5. SYCOJ411
  6. java集合【13】——— Stack源码分析走一波
  7. 万级K8s集群背后 etcd 稳定性及性能优化实践
  8. Python多环境管理神器(pyenv)
  9. gopher协议在SSRF漏洞中的作用
  10. GLPK下载安装