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(){ ...
随机推荐
- 关于 KiCad 画圆弧走线
关于 KiCad 画圆弧走线 有很多关于 关于 KiCad 画圆弧走线的帖子. 最新进展是 V6 在开发中. 但是因为关于 DRC 问题,开发好像有难度. https://bugs.launchpad ...
- js中字符串拼接html
1.使用转义字符 ": " " "+userName+" " " 效果:"userName" 2. 单引号中拼 ...
- C++ 第四次作业 继承
继承 继承时从新的类从已有类那里得到新的特征.继承实现了代码的重用,极大地减少了代码量,同时通过新增成员,加入了自身的独有特性,达到了程序的扩充. 派生类继承了基类的全部数据类和除了构造函数.析构函数 ...
- oracle 用EXISTS替换DISTINCT
当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换 例如: 低效: SELECT DISTINCT DEPT_NO, ...
- laravel 学习笔记blog后台
https://github.com/almasaeed2010/adminlte composer require "almasaeed2010/adminlte=~2.0"
- html选择题
1.下面关于css样式和html样式的不同之处说法正确的是(A) A.html样式只影响应用它的文本和使用所选html样式创建的文本 B.css样式只可以设置文字字体样式 不仅仅能够设置 ...
- 一个简单的hexo搭建博客网站的故事
首先安装hexo mkdir hexo #创建一个文件夹 cd hexo #切换到hexo目录下面 npm install -g hexo-cli npm install hexo --save 然后 ...
- 接管SpringBoot对Activiti的数据源自动配置
SpringBoot的自动配置真的让人又爱又恨,但还是爱更多一点. SpringBoot想要帮我们自动配置好一切,但是有时候配置的却并不是我们需要的,甚至有时候会默默的坑我们. 我的项目是一个多数据源 ...
- H3C 常见ISDN连接方式
- H3C 出站包过滤工作流程