浅析python类继承(一)

 

面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

  通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”,继承的过程,就是从一般到特殊的过程。在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。

  继承概念的实现方式主要有2类:实现继承、接口继承。

  1. 实现继承是指使用基类的属性和方法而无需额外编码的能力。
  2. 接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力(子类重构爹类方法)。

 

继承:

1、继承时,子类会自动调用父类的构造函数

2、多继承:继承的父类会由左向右,一次继承构造第一个继承的父类无构造函数,则会找下一个父类的构造函数,第一个继承的父类有构造函数,那么在实例化子类时就要传相应多的参数,需要多传参数时,就需要重构父类

3、继承类的构造方法:

        经典类的写法: 父类名称.__init__(self,参数1,参数2,...)

        新式类的写法:super(子类,self).__init__(参数1,参数2,....)

4、方法:A类继承B,A类和B类有相同方法时,优先使用A本类的,A类没有时,才去父类B找,使用父类的

5、实例变量:A类继承B,A类和B类有相同实例变量时,优先使用A本类的,A类没有时,才去父类B找,使用父类的

6、类变量:A类继承B,A类和B类有相同类变量时,优先使用A本类的,A类没有时,才去父类B找,使用父类的

7、新式类按广度优选继承的,B、C分别继承A,D继承B、C 执行D,当D没有构造方法找B,当B没有找C,当C没有找A

#单类继承
class People(object):#新式类def __init__(self,name,age):self.name=nameself.age=agedef A(self):print("this is People类 A方法,姓名:%s,年龄:%s"%(self.name,self.age))
class Man(People):#继承People类def A(self):print("this is Man类A方法,姓名:%s,年龄:%s"%(self.name,self.age))def B(self):print("this is Man类B方法继承People类,姓名:%s,年龄:%s"%(self.name,self.age))
class Women(People):#继承People类def __init__(self,name,age,money):#先继承,再重构People.__init__(self,name,age)#继承父类构造方法#super(Women,self).__init__(name,age)#方法2self.money=moneydef B(self):People.A(self)print("this is Women类A方法,姓名:%s,年龄:%s,薪资:%s" % (self.name, self.age,self.money))
p=People("wangli",7)
p.A()
print(p.name,p.age)
m=Man("chengzi",11)
m.A()
m.B()
print(m.name,m.age)
w=Women("xixi",22,111111)
w.B()
print(w.name,w.age,w.money)C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py
this is People类 A方法,姓名:wangli,年龄:7
wangli 7
this is Man类A方法,姓名:chengzi,年龄:11
this is Man类B方法继承People类,姓名:chengzi,年龄:11
chengzi 11
this is People类 A方法,姓名:xixi,年龄:22
this is Women类A方法,姓名:xixi,年龄:22,薪资:111111
xixi 22 111111Process finished with exit code 0

 

#多重继承例1:class Person(object):def __init__(self,name,sex):self.name = nameself.sex = sexdef print_title(self):if self.sex == "male":print("man")elif self.sex == "female":print("woman")class Child(Person):passclass Baby(Child):passMay = Baby("May","female")        # 继承上上层父类的属性
print(May.name,May.sex)            
May.print_title()                 # 可使用上上层父类的方法class Child(Person):                def print_title(self):if self.sex == "male":print("boy")elif self.sex == "female":print("girl")class Baby(Child):passMay = Baby("May","female")
May.print_title()                # 优先使用上层类的方法
#多重继承例2:
class People(object):#新式类name='我是父类变量'def __init__(self,name,age):self.name=nameself.age=agedef A(self):print("this is People类 A方法,姓名:%s,年龄:%s"%(self.name,self.age))
class Relaton(object):def make_friends(self,obj):print("%s is making friends with %s" % (self.name, obj.name))
class Man(People,Relaton):#多重继承def A(self):print("this is Man类A方法,姓名:%s,年龄:%s"%(self.name,self.age))def B(self):print("this is Man类B方法继承People类,姓名:%s,年龄:%s"%(self.name,self.age))
class Women(People,Relaton):#多重继承name='我是Women类变量'def __init__(self,name,age,money):#先继承,再重构People.__init__(self,name,age)#继承父类构造方法self.money=moneydef B(self):People.A(self)print("this is Women类A方法,姓名:%s,年龄:%s,薪资:%s" % (self.name, self.age,self.money))
p=People("wangli",7)
p.A()
print(p.name,p.age)
m=Man("chengzi",20)
m.A()
m.B()
print(m.name,m.age)
w=Women("xixi",22,10000)
w.B()
print(w.name)
print(w.name,w.age,w.money)
print(People.name,Women.name)m.make_friends(w)#多重继承调用C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py
this is People类 A方法,姓名:wangli,年龄:7
wangli 7
this is Man类A方法,姓名:chengzi,年龄:20
this is Man类B方法继承People类,姓名:chengzi,年龄:20
chengzi 20
this is People类 A方法,姓名:xixi,年龄:22
this is Women类A方法,姓名:xixi,年龄:22,薪资:10000
xixi
xixi 22 10000
我是父类变量 我是Women类变量
chengzi is making friends with xixiProcess finished with exit code 0
#多重继承3新式类按广度优先继承构造函数的,B、C分别继承A,D继承B和C 实例化D,会调用执行构造函数,当D没有构造方法找B,当B没有找C,当C没有找A
---------------------------------------------------------
class A(object):pass
class B(A):pass
class C(A):pass
class D(B,C):def __init__(self,name):self.name=nameprint('D类有构造函数优先调本来的【%s】'%self.name)
d=D('橙子') #实例化会自动调构造函数C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py
D类有构造函数优先调本来的【橙子】-------------------------------------------------------
class A(object):pass
class B(A):def __init__(self,name):self.name=nameprint('D类无构造函数,找B类构造函数优先调用【%s】'%self.name)
class C(A):pass
class D(B,C):pass
d=D('橙子') #实例化会自动调构造函数C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py
D类无构造函数,找B类构造函数优先调用【橙子】------------------------------------------------------------class A(object):pass
class B(A):pass
class C(A):def __init__(self,name):self.name=nameprint('D类、B类无构造函数,找C类构造函数优先调用【%s】'%self.name)
class D(B,C):pass
d=D('橙子') #实例化会自动调构造函数C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py
D类、B类无构造函数,找C类构造函数优先调用【橙子】-----------------------------------------------------------------
class A(object):def __init__(self,name):self.name=nameprint('D类、B类、C类无构造函数,找A类构造函数优先调用【%s】'%self.name)
class B(A):pass
class C(A):pass
class D(B,C):pass
d=D('橙子') #实例化会自动调构造函数C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py
D类、B类、C类无构造函数,找A类构造函数优先调用【橙子】
-------------------------------------------------------------------
#继承实例4
class School(object):#学校类def __init__(self,name,addr):self.name=nameself.addr=addrself.students=[]self.staffs=[]def enroll(self,stu_obj):print("为学员%s 办理注册手续"%stu_obj.name)self.students.append(stu_obj)def hire(self,staff_obj):self.staffs.append(staff_obj)print("雇用新员工%s"%staff_obj.name)
class SchoolMember(object):def __init__(self,name,age,sex):self.name=nameself.age=ageself.sex=sexdef tesll(self):pass
class Teacher(SchoolMember):def __init__(self,name,age,sex,salary,course):super(Teacher,self).__init__(name,age,sex)self.salary=salaryself.course=coursedef tell(self):print('''---- info of Teacher:%s ----Name:%sAge:%sSex:%sSalary:%sCourse:%s'''%(self.name,self.name,self.age,self.sex,self.salary,self.course))def teach(self):print("%s is teaching course [%s]"%(self.name,self.course))
class Student(SchoolMember):def __init__(self,name,age,sex,stu_id,grade):super(Student,self).__init__(name,age,sex)self.stu_id=stu_idself.grade=gradedef tell(self):print('''---- info of Student:%s ----Name:%sAge:%sSex:%sStu_id:%sGrade:%s'''% (self.name, self.name, self.age, self.sex, self.stu_id, self.grade))def pay_tuition(self,amount):print("%s has paid tution for $%s" % (self.name, amount))
school=School("橙子IT","陕西")#实例化t1=Teacher("王力",20,"M",200000,"Linux")#实例化
t2=Teacher("王荔",22,"F",3000,"PtrhonDevOps")#实例化s1 = Student("橙汁",36,"MF",1001,"PythonDevOps")#实例化
s2 = Student("橘子",19,"M",1002,"Linux")#实例化t1.tell()
s1.tell()
school.hire(t1)
school.enroll(s1)
school.enroll(s2)
print(school.students)
print(school.staffs)
school.staffs[0].teach()#t1老师的实例.teach()
for stu in school.students:#遍历学生,调学生方法stu.pay_tuition(5000)C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py
---- info of Teacher:王力 ----Name:王力Age:20Sex:MSalary:200000Course:Linux
---- info of Student:橙汁 ----Name:橙汁Age:36Sex:MFStu_id:1001Grade:PythonDevOps
雇用新员工王力
为学员橙汁 办理注册手续
为学员橘子 办理注册手续
[<__main__.Student object at 0x000001BDCB69BCC0>, <__main__.Student object at 0x000001BDCB69BCF8>]
[<__main__.Teacher object at 0x000001BDCB69BC50>]
王力 is teaching course [Linux]
橙汁 has paid tution for $5000
橘子 has paid tution for $5000Process finished with exit code 0

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】常用的数据类型介绍以及它们之间相互转化

在学习一门语言的过程中&#xff0c;首先肯定就是要先接触到它所拥有的数据类型&#xff0c;Python拥有多种主要的数据类型&#xff0c;下面介绍一下下面9种数据类型&#xff0c;以及一些数据类型之间的转化。 目录 1、字符串 2、布尔类型 3、整数 4、浮点数 5、数字 6、列表 7…

django select option拼接时value中空格后的内容被截断

$new $("<option value"List[i] ">"List[i]"</option>" ); $("#project").append( $new ); 此时若value中的字符串有空格&#xff0c;则会被空格截断 解决方法&#xff1a; $new $("<option value"List…

Monkey随机性能压测初探(一)

Monkey介绍 Monkey程序由Android系统自带&#xff0c;是Android SDK提供的一个命令行工具&#xff0c; 可运行Android模拟器和实体设备上。Monkey会发送伪随机的用户事件流&#xff0c;通过Monkey程序模拟用户触摸屏幕、滑动、 按键等操作来对程序进行压力测试&#xff0c;检测…

【Java】使用前准备工作配置环境变量

我们要使用java前&#xff0c;必须先安装JDK并且配置相关的环境变量&#xff0c;如果我们未配置环境变量&#xff0c;那么我们在cmd命令中&#xff0c;输入javac&#xff0c;会提示“javac”不是内部或外部命令&#xff0c;这里主要介绍如何配置jdk的环境变量。 JDK官网下载&a…

怎么在html的img src=src的值这里调用js方法或变量获取图片地址

<html> <head>参考自 </head> <body> <img src"?" id"img"> </body> <script language"javascript"> var adres"图片地址"; document.getElementById(img).src adres; </sc…

Jmeter性能测试工具Timer定时器详解

jmeter提供了很多元件&#xff0c;帮助我们更好的完成各种场景的性能测试&#xff0c;其中&#xff0c;定时器&#xff08;timer&#xff09;是很重要的一个元件&#xff0c;jemter提供了9种定时器&#xff0c;下面一一介绍&#xff1a; 一、定时器的作用域 1、定时器是在每个…

js/jq进行日期格式化为:yyyy-MM-dd 如2017-05-08

设置日期为yyyy-MM-dd,代码如下&#xff1a; function setDefaultDate() {var mydate new Date();var month myDate.getMonth() 1;var day myDate.getDate();month (month.toString().length 1) ? ("0" month) : month;day (day.toString().length 1) ? (…

【Maven】Java项目管理工具

一、为什么要Maven 在开发中经常需要依赖第三方的包&#xff0c;包与包之间存在依赖关系&#xff0c;版本间还有兼容性问题&#xff0c;有时还里要将旧的包升级或降级&#xff0c;当项目复杂到一定程度时包管理变得非常重要。 Maven是当前最受欢迎的Java项目管理构建自动化综合…

fiddler抓包工具配置详解

没有解决不了的问题&#xff0c;只是没有找到合适的方法 fiddler官网 https://www.progress.com/ 官网下载fiddler https://www.telerik.com/download/fiddler/fiddler4 fiddler插件下载 https://www.telerik.com/fiddler/add-ons 最近看到很多人都在问的一个问题&#xff0…

js 截取字符串

本文为大家介绍三种 js 截取字符串的方法&#xff1a; substring() 方法&#xff1b;substr() 方法&#xff1b;slice() 方法&#xff1b; 方法1&#xff1a;substring() 方法 string.substring(from, to) 方法从 from 位置截取到 to 位置&#xff0c;to 可选&#xff0c;没有…

【Maven】Eclipse中的Maven项目安装与配置

上一篇文章我们了解到了Maven的基本信息和如何在电脑本地安装Maven&#xff0c;这篇文章主要介绍如何在Eclipse关联Maven的配置和本地仓储地址&#xff0c;并且如何创建一个Maven项目、关联依赖包等。 一、关联Eclipse和Maven 点击Windows菜单栏下的Preference&#xff0c;找…

python实例方法、类方法@classmethod、静态方法@staticmethod和属性方法@property区别

1、#类方法classmethod&#xff0c;只能访问类变量&#xff0c;不能访问实例变量&#xff0c;通过cls参数传递当前类对象&#xff0c;不需要实例化&#xff0c;直接【类名.方法名()】&#xff0c;可通过类对象和类对象实例访问 类方法&#xff1a;第一个参数强制为类对象&…

python两个字典合并,两个list合并

python两个字典合并&#xff0c;两个list合并 1.两个字典&#xff1a;a{a:1,b:2,c:3} b {aa:11,bb:22,cc:33} 合并1&#xff1a;dict(a,**b) 操作如下&#xff1a; 合并2&#xff1a;dict(a.items()b.items()) 如下&#xff1a; 合并3&#xff1a;c {} c.update(a) c.up…

【Python】time内置模块处理时间信息

python内置time模块&#xff0d;&#xff0d;时间获取和转换 time模块提供各种时间相关的功能 与时间相关的模块有&#xff1a;time,datetime,calendar 这个模块的功能不是适用于所有的平台 这个模块中定义的大部分函数是调用C平台上的同名函数实现 一些术语和约定的解释&#…

python反射详解

反射 #hasattr(obj,name_str)判断一个对象obj里是否有对应的name_str字符串的方法 #getattr(obj,name_str)根据字符串去获取obj对象里的对应的方法的内存地址 #setattr(object, name, value) setattr(x,“foobar”,123)相当于x.foobar 123。 #delattr(object, name) 该函数删…

C++ 一个字符串只包含K和D。K表示杀人,D表示死亡。计算连续杀敌次数,阵亡则归零。

题&#xff1a; 首先笔者的第一思路是前后两个字符串比较。如果相同index。 #include<iostream> #include<stdio.h> #include<string> using namespace std; int main() {string s;cout << "6请输入字符串&#xff1a;" << endl;cin …

【Python】datetime内置模块处理日期和时间

datetime库定义了2个常量和5个类。 2个常量分别是MINYEAR1和MAXYEAR9999。 5个类分别是&#xff1a; date类&#xff1a;表示日期的类 time类&#xff1a;表示时间的类 datetime类&#xff1a;表示时间日期的类 timedelta类&#xff1a;表示两个datetime对象的差值&#xff1b;…

进程与线程区别

进程概念 进程是表示资源分配的基本单位&#xff0c;又是调度运行的基本单位。例如&#xff0c;用户运行自己的程序&#xff0c;系统就创建一个进程&#xff0c;并为它分配资源&#xff0c;包括各种表格、内存空间、磁盘空间、I/O设备等。然后&#xff0c;把该进程放人进程的就…

【业务办理】广州市户口市内迁移流程

一、申办条件 符合下列条件之一的本市户籍人员&#xff08;除学校学生集体户口外&#xff09;&#xff0c;可办理户口市内迁移。 1.迁入本人合法住宅房屋地址。 2.投靠直系亲属&#xff0c;迁入其合法住宅房屋地址&#xff0c;或迁入其家庭户内。 3.因离婚、房屋所有权发生转移…

python多线程threading之阻塞线程(join)线程同步和守护线程(setDaemon(True))实例详解

一、多线程&#xff08;主线程和子线程同时执行&#xff09; 1、主线程是程序本身&#xff0c;看不到的,主线程和子线程没有依赖关系&#xff0c;同步执行的&#xff0c;若主线程先执行完&#xff0c;会等子线程执行完毕&#xff0c;程序结束 2、启动一个线程就是把一个函数传…