由于Python是动态语言,根据类创建的实例可以任意绑定属性。

给实例绑定属性的方法是通过实例变量,或者通过self变量:

class Student(object):def __init__(self, name):self.name = names = Student('Bob')
s.score = 90

但是,如果Student类本身需要绑定一个属性呢?可以直接在class中定义属性,这种属性是类属性,归Student类所有:

class Student(object):name = 'Student'

当我们定义了一个类属性后,这个属性虽然归类所有,但类的所有实例都可以访问到。来测试一下:

>>> class Student(object):
...     name = 'Student'
...
>>> s = Student() # 创建实例s
>>> print(s.name) # 打印name属性,因为实例并没有name属性,所以会继续查找class的name属性
Student
>>> print(Student.name) # 打印类的name属性
Student
>>> s.name = 'Michael' # 给实例绑定name属性
>>> print(s.name) # 由于实例属性优先级比类属性高,因此,它会屏蔽掉类的name属性
Michael
>>> print(Student.name) # 但是类属性并未消失,用Student.name仍然可以访问
Student
>>> del s.name # 如果删除实例的name属性
>>> print(s.name) # 再次调用s.name,由于实例的name属性没有找到,类的name属性就显示出来了
Student

从上面的例子可以看出,在编写程序的时候,千万不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。

练习

为了统计学生人数,可以给Student类增加一个类属性,每创建一个实例,该属性自动增加:

# -*- coding: utf-8 -*-
# 测试:
if Student.count != 0:print('测试失败!')
else:bart = Student('Bart')if Student.count != 1:print('测试失败!')else:lisa = Student('Bart')if Student.count != 2:print('测试失败!')else:print('Students:', Student.count)print('测试通过!')

Run

小结

实例属性属于各个实例所有,互不干扰;

类属性属于类所有,所有实例共享一个属性;

不要对实例属性和类属性使用相同的名字,否则将产生难以发现的错误。

参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017594591051072

Python 实例属性和类属性相关推荐

  1. python实例属性与类属性_Python中的类属性和实例属性引发的一个坑-续

    上篇文章Python 中的类属性和实例属性,我们探讨了类属性和实例属性引发的一个小坑.总结了类属性和实例属性的区别如下:类属性可以被类和实例调用,实例属性只能被实例调用 类属性不会随着实例的调用而改变 ...

  2. python类属性和实例属性_Python 类属性与实例属性,类对象与实例对象用法分析...

    本文实例讲述了Python 类属性与实例属性,类对象与实例对象用法.分享给大家供大家参考,具体如下: demo.py(类属性,所有实例对象共用类属性): # 定义工具类 继承object是为了兼容py ...

  3. python面向对象编程之实例属性和类属性

    廖雪峰python教程 面向对象编程之实例属性和类属性 练习 为了统计学生人数,可以给Student类增加一个类属性,每创建一个实例,该属性自动增加: # -*- coding: utf-8 -*- ...

  4. python实例属性与类属性_Python 面向对象编程:类的创建与初始化、实例属性与方法、类属性与方法...

    1. 类的创建并实例化 类的定义:在Python中,类通过class 关键字定义.按照 Python 的编程习惯,类名以大写字母开头,紧接着是(object),表示该类是从哪个类继承下来的.下面是一个 ...

  5. Python基础-不要对实例属性和类属性使用相同的名字

    示例 #!/usr/bin/env python3 # -*- coding: utf-8 -*- # 不要对实例属性和类属性使用相同的名字class Duck(object):name = &quo ...

  6. python类中的属性分为类属性和实例属性两种_python从入门到大神---1、初始化实例、类属性、方法...

    python从入门到大神---1.初始化实例.类属性.方法 一.总结 一句话总结: 方法不加括号是代码段:感觉python方法和js,php很类似,不加括号是代码段,加括号变成方法,比如f,f() 1 ...

  7. python中属性和类级变量_六、Python类变量和实例变量(类属性和实例属性)

    我们知道,无论是在类中定义的属性还是方法,在类的外部,都无法直接调用它们,因此,我们完全可以把类看做是一个独立的作用域(称为类命名空间),则类属性其实就是定义在类命名空间内的变量(类方法其实就是定义的 ...

  8. python类中的属性分为类属性和实例属性两种_python中类和实例如何绑定属性与方法示例详解...

    前言 python类与实例的方法的调用中觉得云里雾里,思考之后将自己的想法记录下,一来加深自己理解,巩固自己记忆,而来帮助一些想要学习python的朋友理解这门抽象的语言,由于Python是动态语言, ...

  9. python中类的属性一般来说_python中实例属性和类属性之间的关系

    匿名用户 1级 2018-06-25 回答 一般来说,在Python中,类实例属性的访问规则算是比较直观的. 但是,仍然存在一些不是很直观的地方,特别是对C++和Java程序员来说,更是如此. 在这里 ...

最新文章

  1. R语言dim函数获取dataframe、matrix的维度、shape实战
  2. 视频检测分割--Deep Feature Flow for Video Recognition
  3. Rust crates.io换国内镜像源
  4. Qt 软键盘[模拟]之键盘触发事件
  5. Linux环境下安装PHP的memced扩展
  6. 几行代码,网盘链接提头来见!
  7. lrange是取出所有值并移除么_美欧日站点亚马逊物流库存绩效指标分数达标值将降低为 450...
  8. linux100day(day4)--文本处理三剑客
  9. 工作218:页面样式调整
  10. C#2005中如何把unicode编码的数字转化为EBCDIC编码
  11. 67页综述深度卷积神经网络架构:从基本组件到结构创新
  12. mysql将最大金额加1000_Mysql数据库笔记
  13. java.lang.NullPointerException org.apache.jsp.index_jsp._jspInit(index_jsp.java:22)
  14. Python函数的静态变量
  15. mysql主从简明配置
  16. C++程序设计方法3:类中的静态成员
  17. 洛谷 3373 【模板】线段树 2
  18. 国际项目投标那些事(六)投标文件怎么写才能惊呆业主 WTSolutions
  19. SIM868硬件设计学习(一)
  20. teeth mirror牙小护牙膏让你唇红齿白,亮白笑容不是梦

热门文章

  1. access开发精要(15)-货币与数字类型格式(3)
  2. python3精要(19)-全局变量global和工厂函数,lambda,变量作用范围,nonlocal
  3. mxnet基础到提高(22)-C++-常量和变量
  4. 【机器学习】为什么GBDT可以超越深度学习
  5. 温州大学《机器学习》课程课件(二)(回归)
  6. 【深度学习】PyTorch 历史版本安装-祖传老代码运行刚需
  7. 【竞赛相关】南大化院博士刘子腾:跨专业如何做数据竞赛浅谈
  8. 【NLP】打破BERT天花板:11种花式炼丹术刷爆NLP分类SOTA!
  9. 【白话机器学习】算法理论+实战之K-Means聚类算法
  10. 大盘点|卷积神经网络必读的 100 篇经典论文,包含检测 / 识别 / 分类 / 分割多个领域