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)
输出:

python之子类继承父类时进行初始化的一些问题的更多相关文章
- java中子类继承父类时是否继承构造函数
来源:http://www.cnblogs.com/sunnychuh/archive/2011/09/09/2172131.html --------------------- java继承中对构造 ...
- python 子类继承父类__init__(转载)
转载: http://www.jb51.net/article/100195.htm 前言 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__方法 ...
- python - class类 (五) 继承补充-子类继承父类属性/函数方法
子类继承父类属性/函数方法: #方式一:(原生方式,不建议使用) class Dongwu(object): def __init__(self,name,sex,old): self.name = ...
- @Inherited:允许子类继承父类的注解。
在看定义注解的相关文章的时候,看到这个@Inherited注解,简单的说明并没有真正搞懂是什么意思.在网上搜索了一些相关的内容,现在把一篇文章转载过来.以便后面使用. 文章出处,转载地址:(http: ...
- C#中通过类来继承两个接口,父类实例化接口中的方法,子类继承父类,调用方法
实现了父类继承接口,父类实例化接口的方法,子类继承父类,子类调用父类的方法直接使用 代码如下: using System; using System.Collections.Generic; usin ...
- java中子类继承父类程序执行顺序
java中子类继承父类程序执行顺序 FatherTest.java public class FatherTest { private String name; public FatherTest() ...
- python中子类调用父类的方法
1子类调用父类构造方法 class Animal(object): def __init__(self): print("init Animal class~") def run( ...
- java中子类继承父类程序执行顺序问题
Java中,new一个类的对象,类里面的静态代码块.非静态代码.无参构造方法.有参构造方法.类的一般方法等部分,它们的执行顺序相对来说比较简单,用程序也很容易验证.比如新建一个测试父类. public ...
- java子类继承父类的方法(代码简略版)
父类:public class Subjects { public void b() { System.out.println("学科"); } public void a(){ ...
随机推荐
- 突然想起一个有趣的问题:FAT32&NTFS?
在大学的时候老师提过一个有意思的问题4G的程序存储在什么格式以上的电脑? 首先普及一下两种格式的区别 FAT32:此硬盘格式不支持4GB以上大文件,使用32位文件分配表. NTFS:微软最新文件格式, ...
- 设计模式 - 工厂模式(factory pattern) 具体解释
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/27081511 工厂模式(factory pa ...
- c++中单引号和双引号的区别
在C++中单引号表示字符,双引号表示字符串. 例如 :在定义一个数组的时候string a [5]={"nihao","henhao","good&q ...
- 2019徐州网络赛 I.query
这题挺有意思哈!!!看别人写的博客,感觉瞬间就懂了. 这道题大概题意就是,给一串序列,我们要查找到l-r区间内,满足min(a[ i ],a[ j ]) = gcd(a[ i ],a[ j ]) 其实 ...
- 2016年开源软件排名TOP50,最受IT公司欢迎的50款开源软件
2016年开源软件排名TOP50,最受IT公司欢迎的50款开源软件 过去十年间,许多科技公司已开始畅怀拥抱开源.许多公司使用开源工具来运行自己的 IT 基础设施和网站,一些提供与开源工具相关的产品和服 ...
- 原生sql和 TP sql怎么关联?
整合后
- Nginx 日志记录post数据,并使用goaccess进行日志分析
nginx日志默认不会记录post数据 在nginx配置文件的http节 log_format 日志格式标识 [escape=json] 日志格式 比如:日志格式标识设置为main,添加escape= ...
- zoj 1633 Big String
Big String Time Limit: 2 Seconds Memory Limit: 65536 KB We will construct an infinitely long string ...
- 2018-8-10-WPF-调试-获得追踪输出
title author date CreateTime categories WPF 调试 获得追踪输出 lindexi 2018-08-10 19:16:51 +0800 2018-05-16 1 ...
- 如何安装Anaconda和Python
1.下载安装文件 https://www.anaconda.com/download/ 2.百度安装方法:https://jingyan.baidu.com/article/3f16e0031e875 ...