直接看代码:

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之子类继承父类时进行初始化的一些问题的更多相关文章

  1. java中子类继承父类时是否继承构造函数

    来源:http://www.cnblogs.com/sunnychuh/archive/2011/09/09/2172131.html --------------------- java继承中对构造 ...

  2. python 子类继承父类__init__(转载)

    转载: http://www.jb51.net/article/100195.htm 前言 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__方法 ...

  3. python - class类 (五) 继承补充-子类继承父类属性/函数方法

    子类继承父类属性/函数方法: #方式一:(原生方式,不建议使用) class Dongwu(object): def __init__(self,name,sex,old): self.name = ...

  4. @Inherited:允许子类继承父类的注解。

    在看定义注解的相关文章的时候,看到这个@Inherited注解,简单的说明并没有真正搞懂是什么意思.在网上搜索了一些相关的内容,现在把一篇文章转载过来.以便后面使用. 文章出处,转载地址:(http: ...

  5. C#中通过类来继承两个接口,父类实例化接口中的方法,子类继承父类,调用方法

    实现了父类继承接口,父类实例化接口的方法,子类继承父类,子类调用父类的方法直接使用 代码如下: using System; using System.Collections.Generic; usin ...

  6. java中子类继承父类程序执行顺序

    java中子类继承父类程序执行顺序 FatherTest.java public class FatherTest { private String name; public FatherTest() ...

  7. python中子类调用父类的方法

    1子类调用父类构造方法 class Animal(object): def __init__(self): print("init Animal class~") def run( ...

  8. java中子类继承父类程序执行顺序问题

    Java中,new一个类的对象,类里面的静态代码块.非静态代码.无参构造方法.有参构造方法.类的一般方法等部分,它们的执行顺序相对来说比较简单,用程序也很容易验证.比如新建一个测试父类. public ...

  9. java子类继承父类的方法(代码简略版)

    父类:public class Subjects { public void b() { System.out.println("学科"); } public void a(){ ...

随机推荐

  1. 数据节点Datanodes

  2. @NOI模拟2017.06.30 - T1@ Left

    目录 @description@ @solution@ @accepted code@ @details@ @description@ JOHNKRAM 最近在研究排序网络,但他发现他不会制作比较器, ...

  3. Project Euler Problem 12-Highly divisible triangular number

    最直接的想法就是暴力搞搞,直接枚举,暴力分解因子.再好一点,就打个素数表来分解因子.假设num=p1^a1p2^a2...pn^an,则所有因子个数为(a1+1)(a2+1)...(an+1). 再好 ...

  4. HTML的基本结构和标签分类

    HTML:超文本标记语言 HTML基本结构 <!DOCTYPE html> <html> <head> <meta charset="utf-8&q ...

  5. Python:pip 和pip3的区别

    前言 装完python3后发现库里面既有pip也有pip3,不知道它们的区别,因此特意去了解了一下. 解释 先搜索了一下看到了如下的解释, 安装了python3之后,库里面既会有pip3也会有pip ...

  6. 通过git从码云克隆项目到本地

    1.下载安装Git,傻瓜式下一步下一步即可... 2.配置Git: 2.1.选择你要clone到本地的路径:右键--->$ Git Bash Here,弹出Linux命令窗口:$ cd ~直接回 ...

  7. ABSD 基于架构的软件设计方法方法简介(摘抄)

    ABSD(Architecture-Based Software Design)基于架构的软件设计方法 有三个基础: 第一个基础是功能分解.在功能分解中,ABSD方法使用已有的基于模块的内聚和耦合技术 ...

  8. H3C 用debugging ppp all命令调试PPP

  9. Vue打包后放到服务器出现Loading chunk {n} failed 错误

    导航栏点击切换时 会出现Loading chunk {n} failed  ,刷新之后便不会出现.而且n在最新的build的文件中,n没有存在 偶然一次发现,项目更新迭代开发时上传测试环境后就会出现, ...

  10. Lifecycle mapping "org.eclipse.m2e.jdt.JarLifecycleMapping" Eclipse Maven报错

    eclipse 项目中报错Lifecycle mapping "org.eclipse.m2e.jdt.JarLifecycleMapping" is not available, ...