python之子类继承父类时进行初始化的一些问题
2020-01-03 00:05
1251 查看
直接看代码:
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)
输出:
相关文章推荐
- 继承中,父类和子类构造方法初始化所遇问题
- 静态变量、实例变量初始化时机,以及子类隐藏父类成员时,创建子类对象的一些问题
- python子类继承父类(包括父类的初始化)
- 关于继承与构造函数重载的问题(初始化子类构造函数中的父类对象)求解答。。。
- java中类的继承,虚拟机会如何进行父类和子类的初始化加载
- [python相关]多类继承中子类默认继承哪个父类的构造函数__init__
- 解决重写父类的方法且不会影响继承的子类的问题
- Python开发基础-Day20继承实现原理、子类调用父类的方法、封装
- c++子类继承父类的覆盖问题
- 关于PHP中构造函数以及子类继承父类构造函数的相关问题
- 多态中父类引用指向子类对象的一些问题的个人看法
- 关于子类继承父类后调用方法的问题
- 关于继承时子类重写父类方法和覆盖父类变量的若干问题 (待进一步研究)
- 子类继承父类 构造函数访问问题
- Java对象初始化步骤&&子类继承父类后变量与方法调用情况
- java中子类继承父类程序执行顺序问题
- python 父类与子类的一些说明
- 子类继承父类放法访问权限的问题
- java中子类继承父类程序执行顺序问题
- python基础之类的继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法