美文网首页python学习交流
关于python类的继承的一个小坑

关于python类的继承的一个小坑

作者: 水之心 | 来源:发表于2018-12-07 17:11 被阅读2次

我们来看看一个很普通的类的继承:

class Model:
    name = "DNN"

    def __init__(self, name):
        self.name = name

    def print_name(self):
        print(self.name)

    @classmethod
    def print_cls_name(cls):
        print(cls.name)


class CNNModel(Model):
    name = "CNN"


def main():
    cnnmodel = CNNModel("Lenet")
    cnnmodel.print_name()
    CNNModel.print_cls_name()


if __name__ == '__main__':
    main()

大家都很容易猜出结果:

Lenet
CNN

但是,我们再看看另一个代码:

class Model:
    __name = "DNN"

    def __init__(self, name):
        self.__name = name

    def print_name(self):
        print(self.__name)

    @classmethod
    def print_cls_name(cls):
        print(cls.__name)


class CNNModel(Model):
    __name = "CNN"


def main():
    cnnmodel = CNNModel("Lenet")
    cnnmodel.print_name()
    CNNModel.print_cls_name()


if __name__ == '__main__':
    main()

此时,结果便不是我们预期那样:

Lenet
DNN

我们使用 __ 隐藏了 name 的类变量,此时,类变量 __name 被牢牢的绑定在了父类上,子类无法更改。所以便出现了这样的情况。

更专业的说法:

  1. 以单下划线开头,表示这是一个保护成员,只有类对象和子类对象自己能访问到这些变量。以单下划线开头的变量和函数被默认是内部函数,使用 from module import * 时不会被获取,但是使用 import module 可以获取。
  2. 以单下划线结尾仅仅是为了区别该名称与关键词
  3. 双下划线开头,表示为私有成员,只允许类本身访问,子类也不行。在文本上被替换为 _class__method
  4. 双下划线开头,双下划线结尾。一种约定,Python 内部的名字,用来区别其他用户自定义的命名,以防冲突。是一些 Python 的“魔术”对象,表示这是一个特殊成员,例如:定义类的时候,若是添加 __init__ 方法,那么在创建类的实例的时候,实例会自动调用这个方法,一般用来对实例的属性进行初使化,Python 不建议将自己命名的方法写为这种形式。即以双下划线开头的方法和变量不会被继承

相关文章

  • 关于python类的继承的一个小坑

    我们来看看一个很普通的类的继承: 大家都很容易猜出结果: 但是,我们再看看另一个代码: 此时,结果便不是我们预期那...

  • 基础篇: 11. Python类继承

    Python类继承是一个很复杂的体系,但说简单其实就是父类和子类关于成员属性和方法的继承与派生.继承就是子继承父类...

  • 2018-09-10 day16-类补充总结

    多继承 python支持类的多继承 python进行多继承时,子类能够继承父类的所有字段和方法,但是只能继承第一个...

  • 类的继承顺序

    python2新式类继承object的类python2经典类未继承任何类的python2新式类和python3的继...

  • python中的类的继承、多态和运算符重载

    类的继承 1.继承 python中的类支持继承,并且支持多继承。 python中默认情况是继承自object(ob...

  • 2018-08-01python学习面向对象(类的继承)

    子类:继承者父类(超类):被继承者1.怎么继承python中类是可以继承的,并且支持多继承 说明:python中所...

  • 一阶段day16-01面向对象

    Python中类支持继承,并且支持多继承 一、继承 1、什么是继承 父类(超类):被继承的类子类:继承父类的类继承...

  • 2018-10-19面向对象和pygame

    类的继承 python中的类支持继承,并且支持多继承 1.什么是继承 父类(超类):被继承的类子类:继承的类继承就...

  • Python继承

    python可以分为单继承和多继承; 单继承: 单继承就是继承一个类的时候,现在我们定义一个Student类 然后...

  • day16

    类的继承 python中的类支持继承,并且支持多继承() 1.什么是继承 父类(超类):被继承的类子类:去继承的类...

网友评论

    本文标题:关于python类的继承的一个小坑

    本文链接:https://www.haomeiwen.com/subject/omfxhqtx.html