Python的类变量和实例变量

首先我们看一段代码以及输出:

In [2]: class Student():
   ...:     name = "张三"
   ...:     age = 0
   ...:     def __init__(self, name, age):
   ...:         name = name 
   ...:         age = age
   ...:         

In [3]: student = Student("李四", 19)

In [4]: student.name
Out[4]: '张三'

In [5]: Student.name
Out[5]: '张三'

看到这里可能有的同学会说是变量的作用域问题,事实上是实例变量和类变量的区别问题。

我们接着看看对象student的变量有哪些:

In [6]: student.__dict__
Out[6]: {}

为空!

为什么为空呢?(暂时思考下)
我们再看看类Student的变量:

In [7]: Student.__dict__
Out[7]: 
mappingproxy({'__dict__': <attribute '__dict__' of 'Student' objects>,
              '__doc__': None,
              '__init__': <function __main__.Student.__init__>,
              '__module__': '__main__',
              '__weakref__': <attribute '__weakref__' of 'Student' objects>,
              'age': 0,
              'name': '张三'})

这里我们要说一下实例变量的查找机制:
当在实例变量中查找不到某一变量时候,就会去类变量里查找,当再查找不到的时候就会在父类中查找,因此输出的name为张三。

之所以为空,是因为我们实例化对象的时候为指明实例变量的保存。现在修改一下实例化函数。

In [10]: class Student():
    ...:     name = "张三"
    ...:     age = 0
    ...:     def __init__(self, name, age):
    ...:         self.name = name 
    ...:         self.age = age
    ...:         
    ...:         
    ...:         

In [11]: student = Student("李四", 19)

In [12]: student.name
Out[12]: '李四'

In [13]: Student.name
Out[13]: '张三'

我们传入的self只和实例化的对象有关和类无关,代表实例。

如何在实例方法中调用类变量呢?

In [14]: class Student():
    ...:     name = "张三"
    ...:     age = 0
    ...:     sums = 123
    ...:     def __init__(self, name, age):
    ...:         self.name = name 
    ...:         self.age = age
    ...:         print(Student.sums)
    ...:         print(self.__class__.sums)
    ...:         
    ...:         
    ...:         
    ...:         

In [15]: student = Student('李四', 19)
123
123
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,576评论 18 399
  • 一. Java基础部分.................................................
    wy_sure阅读 9,297评论 0 11
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,174评论 19 139
  • 面向对象主要针对面向过程。 面向过程的基本单元是函数。 什么是对象:EVERYTHING IS OBJECT(万物...
    sinpi阅读 4,804评论 0 4
  • 最近热映的《银河护卫队》中加入的螳螂妹的角色是否给你带来了很多笑点?对于星爵来说是非常隐私的事情居然被螳螂妹当众说...
    斯坦威阅读 3,858评论 0 0

友情链接更多精彩内容