专栏首页数据分析与挖掘python之子类继承父类时进行初始化的一些问题

python之子类继承父类时进行初始化的一些问题

直接看代码:

class Person:
    def __init__(self):
        self.name = "jack"
class Student(Person):
    def __init__(self):
        self.school = "一中"
stu = Student()
print("学生的姓名是:",stu.name)

此时,程序是不能正常运行的,运行之后报错:

这是为什么呢?

__init__相当于是python类的构造方法,在类进行实例化时被调用,当子类和父类中都存在构造方法时,子类中需要显示调用父类的构造方法 。需要注意的是python中构造方法是不能进行重载的,当有多个构造方法存在时,会默认调用最后一个构造方法。修改后的代码如下:

class Person:
    def __init__(self):
        self.name = "jack"
class Student(Person):
    def __init__(self):
        super(Student, self).__init__()
        self.school = "一中"
stu = Student()
print("学生的姓名是:",stu.name)

此时的结果就是正常的。

super(Student, self).__init__():其中super关键字表示父类,Student是本类的名称,self指代本类自己。

在python中如何设置私有属性和方法?

将属性和方法前面加上__(双下划线)。加上了私有的属性和方法不能在类外进行访问,同时,子类继承父类的属性和方法时,在子类中也不能够访问父类的私有属性和方法。

举个例子:

class Person:
    def __init__(self):
        self.__name = "jack"
    def __test(self):
        print("这是父类的私有方法")
class Student(Person):
    def __init__(self):
        super(Student, self).__init__()
        super().__test()
        self.school = "一中"
stu = Student()

以上代码会报错:

要想访问到父类的私有属性和方法,需这样做:

class Person:
    def __init__(self):
        self.__name = "jack"
        self.age = 12
    def __test(self):
        print("这是父类的私有方法")
    def test(self):
        print("这是父类的公有方法")
class Student(Person):
    def __init__(self):
        super(Student, self).__init__()
        self.school = "一中"
    def printStudent(self):
        #子类自己继承了父类的公有属性,直接访问即可
        print("在子类中使用父类的共有属性:",self.age)
        #super()代表父类,可以访问父类的公有方法
        #当然如若子类没有重写父类的方法,也可以使用self.test()来调用
        #super和self区别:super是指代父类,self指代该类本身
        super().test()
        #对于父类的私有属性和方法,需要通过_父类名__属性或方法名来访问
        #super()._Person__test()
        self._Person__test()
stu = Student()
print("学生的姓名是:",stu._Person__name)
print("学生的年龄是:",stu.age)
stu._Person__test()
stu.printStudent()

输出:

需要明确的是python中并没有真正意义上的私有修饰符,从以上的代码也可以看出。Python在运行时会将__属性或方法转换成:_类名__属性或方法。通过这种方式就可以访问到类私有属性或方法。还有一种方式就是通过在类内部再定义一个公有方法,来调用私有的属性或方法,在子类进行调用时调用这个公有的方法即可,这也就是面向对象中封装的作用之一,在接下来会结合进行介绍。

那么假设父类的构造器带有参数,那么在子类中应该如何进行初始化呢?

子类要在初始化的时候显示调用父类的有参构造,并且传入相应的参数,具体代码如下:

class Person:
    def __init__(self,name,age):
        self.name = name
        self.__age = age
    def __test(self):
        print("这是父类的私有方法")
    def test(self):
        self.__test()
        print("这是父类的公有方法")
    def setAge(self,age):
        self.__age = age
    def getAge(self):
        return self.__age
class Student(Person):
    def __init__(self,school,name,age):
        super(Student, self).__init__(name=name,age=age)
        self.school = school
    def stuTest(self):
        super().test()
        print("所在学校为:",self.school)
stu = Student("一中","tom",12)
stu.stuTest()
print("学生的姓名是:",stu.name)
print("学生的年龄是:",stu.getAge())

输出:

补充:

假设父类中没有显示的定义构造函数,那么在子类中就不用显示的定义父类的构造函数。

class Person:
    def test(self):
        print("什么都没有")
class Student:
    def __init__(self,name):
        self.name = name
stu = Student("tom")
print("姓名是:",stu.name)

输出:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【python实现卷积神经网络】批量归一化层实现

    代码来源:https://github.com/eriklindernoren/ML-From-Scratch

    绝命生
  • 【论文笔记】张航和李沐等提出:ResNeSt: Split-Attention Networks(ResNet改进版本)

    github地址:https://github.com/zhanghang1989/ResNeSt

    绝命生
  • python之利用魔术方法实现自己定义的二维向量

    绝命生
  • python pyqt5弹出子窗体

    from PyQt5 import QtCore, QtGui, QtWidgets import sys from PyQt5.QtWidgets imp...

    用户5760343
  • 用python实现学生管理系统

    相信大家学各种语言的时候,练习总是会写各种管理系统吧,管理系统主要有对数据的增删查改操作,原理不难,适合作为练手的小程序

    砸漏
  • Python实现子类调用父类方法

    这是因为尽管Student类继承了Person类,但是并没有调用父类的__init__()方法,那么怎样调用父类的方法呢? 有如下两种解决方案:

    用户2936342
  • python项目练习五:虚拟茶话会

    几乎在学习、使用任何一种编程语言的时候,关于socket的练习从来都不会少,尤其是会写一些局域网的通信的东西。所以书上的这个项目刚好可以练习一下socket编程...

    the5fire
  • 基础数据结构 例:栈、队列、链表、数据、字典、树、等【玩转腾讯云】

    栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,把另一端称为栈底。向一个栈插入新元素又称作 进栈、...

    IT茂茂
  • 模板方法模式

    不知道你有没有注意过,我们实现某个业务功能,在不同的对象会有不同的细节实现, 以前说过策略模式, 策略模式是将逻辑封装在一个类(提到的文章中的Duck)中,然后...

    用户2936342
  • python项目练习三:万能的XML

    这个项目的名称与其叫做万能的XML不如叫做自动构建网站,根据一份XML文件,生成对应目录结构的网站,不过只有html还是太过于简单了,如果要是可以连带生成css...

    the5fire

扫码关注云+社区

领取腾讯云代金券