zoukankan      html  css  js  c++  java
  • 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)

    输出:

  • 相关阅读:
    java数的相加
    读大道至简第二章有感
    读大道至简第一章有感
    课题的跨专业组队
    返回一个整数数组中最大子数组的和。
    《构建之法》阅读笔记02
    单元测试(2)
    软件工程个人作业03
    单元测试
    团队
  • 原文地址:https://www.cnblogs.com/xiximayou/p/12142888.html
Copyright © 2011-2022 走看看