zoukankan      html  css  js  c++  java
  • 经典题,类中的变量

    以下的代码的输出将是什么? 说出你的答案并解释。

     1 class Parent(object):
     2     x = 1
     3 class Child1(Parent):
     4     pass
     5 class Child2(Parent):
     6     pass
     7 print Parent.x, Child1.x, Child2.x
     8 Child1.x = 2
     9 print Parent.x, Child1.x, Child2.x
    10 Parent.x = 3
    11 print Parent.x, Child1.x, Child2.x

    答案

    以上代码的输出是:

    1 1 1

    1 2 1

    3 2 3

    使你困惑或是惊奇的是关于最后一行的输出是 3 2 3 而不是 3 2 1。为什么改变了 Parent.x 的值还会改变 Child2.x 的值,但是同时 Child1.x 值却没有改变?

    这个答案的关键是,在 Python 中,类变量在内部是作为字典处理的。如果一个变量的名字没有在当前类的字典中发现,将搜索祖先类(比如父类)直到被引用的变量名被找到(如果这个被引用的变量名既没有在自己所在的类又没有在祖先类中找到,会引发一个 AttributeError 异常 )。

    因此,在父类中设置 x = 1 会使得类变量 X 在引用该类和其任何子类中的值为 1。这就是因为第一个 print 语句的输出是 1 1 1。

    随后,如果任何它的子类重写了该值(例如,我们执行语句 Child1.x = 2),然后,该值仅仅在子类中被改变。这就是为什么第二个 print 语句的输出是 1 2 1。

    最后,如果该值在父类中被改变(例如,我们执行语句 Parent.x = 3),这个改变会影响到任何未重写该值的子类当中的值(在这个示例中被影响的子类是 Child2)。这就是为什么第三个 print 输出是 3 2 3。

    问题的关键点请看上述红色文字!这个问题很基础,但是相信有不少同学也会在这里犯错误,所以平时基本功要做好。

     
    python中七大经典面试题:
    https://blog.csdn.net/u011860731/article/details/46955307
     
    小闫面试题:
    https://www.cnblogs.com/Noul/p/10050553.html

     

  • 相关阅读:
    七:webpack.config.js文件的高级配置
    六:webpack-dev-server 设置反向代理解决跨域问题
    四:Webpack执行命令参数详解
    二:Webpack的基本配置
    一:WebPack的安装
    三:Webpack模块的导出以及之间的依赖引用
    Vue-vue-router.js路由--API
    Vue-vue-router.js路由--进级
    RSA非对称加密,公钥加密/私钥解密
    SHA256withRSA证书签名,私钥签名/公钥验签
  • 原文地址:https://www.cnblogs.com/Mezhou/p/10057463.html
Copyright © 2011-2022 走看看