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(){ ...
随机推荐
- Win10家庭版如何启用本地组策略
组策略对于优化和维护Windows系统来说十分重要.众所周知,Windows 10家庭版中并不包含组策略,对于使用家庭版Windows的朋友来说,十分不方便.小编将以Windows10家庭版为例,带大 ...
- phpstudy一直使用php5.6版本一直“”“报错应用程序无法正常启动0xc000007b”,亲测可行
http://www.php.cn/xiazai/gongju/1351 vc9和vc11-vc14运行库 2018-01-26 来源/作者:php中文网 «» 下载次数:7808 工具简介: php ...
- hdu 4419 Colourful Rectangle (离散化扫描线线段树)
Problem - 4419 题意不难,红绿蓝三种颜色覆盖在平面上,不同颜色的区域相交会产生新的颜色,求每一种颜色的面积大小. 比较明显,这题要从矩形面积并的方向出发.如果做过矩形面积并的题,用线段树 ...
- EF CodeFirst 实例Demo
一直想搞一个EFCodeFirst的Demo,让自己通过实例真正了解CodeFirst,方便以后有需求的时候可以有思路.网上查了很多资料,发现很多博主的文章大量重复,根据推荐步骤走并不一定能够成功,而 ...
- WPF 之 DataTemplate 实例(摘抄)
- RBF神经网络的matlab简单实现
径向基神经网络 1.径向基函数 (Radial Basis Function,RBF) 神经网络是一种性能良好的前向网络,具有最佳逼近.训练简洁.学习收敛速度快以及克服局部最小值问题的性能,目前已经证 ...
- Python--day49--ORM框架SQLAlchemy之relationship的使用(有时间要从新看,这里状态不好,没有仔细听)
小贴士: 迭代器:只有在循环的时候才一个一个往外拿 relationship
- java final域
public final class ThreeStooges { /* * stooges是Set<String>类型的引用,final限定该引用成员属性stooges被赋初值后,就不能 ...
- JPA一对多循环引用的解决&&JackSon无限递归问题
说是解决,其实不是很完美的解决的,写出来只是想记录一下这个问题或者看一下有没有哪位仁兄会的,能否知道一二. 下面说说出现问题: 问题是这样的,当我查询一个一对多的实体的时候,工具直接就爆了,差不多我就 ...
- Codeforces Round #564 (Div. 2) D. Nauuo and Circle(树形DP)
D. Nauuo and Circle •参考资料 [1]:https://www.cnblogs.com/wyxdrqc/p/10990378.html •题意 给出你一个包含 n 个点的树,这 n ...