继承的实现原理

一.继承的实现原理

  1.继承顺序

    1.1单独分叉线路:经典类与新式类依次从左到右,深度优先

    1.2多条重合线路:经典类一路到头,深度优先;新式类,广度优先。<参考MRO列表,仅在新式类有>

class A(object):def test(self):print('from A')class B(A):def test(self):print('from B')class C(A):def test(self):print('from C')class D(B):def test(self):print('from D')class E(C):def test(self):print('from E')class F(D,E):# def test(self):#     print('from F')pass
f1=F()
f1.test()
print(F.__mro__) #只有新式才有这个属性可以查看线性列表,经典类没有这个属性#新式类继承顺序:F->D->B->E->C->A
#经典类继承顺序:F->D->B->A->E->C
#python3中统一都是新式类
#pyhon2中才分新式类与经典类
View Code

  2.SUPER方法的应用<使用super调用的所有属性,都是从MRO列表当前的位置往后找,千万不要通过看代码去找继承关系,一定要看MRO列表>

  子类调用父类的方法:

  super()---->是一个对象,可以查看

方法一:

class Vehicle: #定义交通工具类Country='China'def __init__(self,name,speed,load,power):self.name=nameself.speed=speedself.load=loadself.power=powerdef run(self):print('开动啦...')class Subway(Vehicle): #地铁def __init__(self,name,speed,load,power,line):Vehicle.__init__(self,name,speed,load,power)self.line=linedef run(self):print('地铁%s号线欢迎您' %self.line)Vehicle.run(self)line13=Subway('中国地铁','180m/s','1000人/箱','',13)
line13.run()
View Code

方法二:

class People:def __init__(self,name,age,sex):self.name=nameself.age=ageself.sex=sexdef foo(self):print('from parent')class Teacher(People):def __init__(self,name,age,sex,salary,level):# People.__init__(self,name,age,sex) #指名道姓地调用People类的__init__函数#在python3中super().__init__(name,age,sex) #调用父类的__init__的功能,实际上用的是绑定方法#在python2中# super(Teacher,self).__init__(name,age,sex)self.salary=salaryself.level=leveldef foo(self):super().foo()print('from child')t=Teacher('egon',18,'male',3000,10)
# print(t.name,t.age,t.sex,t.salary,t.level)
t.foo()
View Code

  3.访问限制

  如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。

具体参考博客:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318650247930b1b21d7d3c64fe38c4b5a80d4469ad7000

 

  4.property的使用

  property装饰器,把装饰函数伪装成一个名词属性。

class People:def __init__(self, name, weight, height):self.name = nameself.weight = weightself.height = height# @propertydef bmi(self):return self.weight / (self.height ** 2)f = People('egon', 70, 1.80)
f.height=1.82
print(f.bmi())  #不加装饰器
#如果没有@property装饰器的话,调用函数属性就得f.bmi(),这样的接口给人一种明显的执行程序代码痕迹,而用
#该装饰器则直接调用f.bmi,更加方便客户的使用。
# print(f.bmi)  #加装饰器后
View Code

  与装饰器property连用的setter,deleter.

 

class People:def __init__(self,name,age,sex,height,weight):self.__name=nameself.__age=age          #此处都是私有属性,所以需要开放接口来让对象查看属性,因此才会用到相应的装饰器去修改和删除属性。self.__sex=sexself.__height=heightself.__weight=weightdef tell_info(self):print('''
        姓名:%s 年龄:%s 性别:%s 高度:%scm 体重:%skg'''%(self.__name,self.__age,self.__sex,self.__height,self.__weight))
@property              def name(self):       #被property装饰器装饰后,可以直接调用namereturn self.__name@name.setter        ##此处的name就是加上property装饰器后的name,该name.setter装饰器为了修改属性.def name(self,value):if not isinstance(value,str):raise TypeError('字符串格式')self.__name=valuereturn self.__name@name.deleter     ##此处的name就是加上property装饰器后的name,该name.deleter装饰器为了删除属性.def name(self):del self.__name@propertydef bmi(self):return self.__weight /(self.__height^2)p1=People('egon',18,'male',170,60)
p1.tell_info()
print(p1.name)
p1.name='hason'    #利用name.setter接口修改属性
del p1.name        #利用name.deleter接口删除属性
View Code

 

转载于:https://www.cnblogs.com/junxiansheng/p/7122944.html

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

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

相关文章

Python自动化之列表

##将首字母改成大写# name alex# v name.capitalize()# print(v)##将首字母改成小写# name Alex# v name.casefold()# print(v)###传一个值&#xff0c;两边补的是添加的字符# name Alex# v name.center(20,*)# print(v)##统计字符串出现的次数# name Alex# v name.cou…

Request请求

Request请求&#xff1a; Request请求&#xff0c;就是客户端希望从服务器端获取资源&#xff0c;向服务器发出询问。在B/S架构中&#xff0c;就是客户浏览器向服务器发出询问。在我们的JavaEE工程中&#xff0c;客户浏览器发出询问&#xff0c;要遵循HTTP协议所规定的。请求对…

MySQL编程基础

本文是关于MySQL编程中的一些基础知识&#xff0c;包括变量和运算符、常用语句、函数。 一、变量与运算符 1.用户会话变量声明&#xff1a;SET 变量名 表达式;//即&#xff1a;用户会话变量无需提前定义&#xff0c;直接用赋值语句赋值&#xff0c;就算是定义了&#xff08;也…

Response响应方法详解

Response&#xff1a; 响应&#xff1a;服务器把请求的处理结果告知客户端。在B/S架构中&#xff0c;响应就是把结果带回浏览器。响应对象&#xff1a;在项目中用于发送响应的对象 常用状态码&#xff1a; 状态码说明200执行成功302它和307一样&#xff0c;都是用于重定向的状…

perl6 HTTP::UserAgent (2)

http://www.cnblogs.com/perl6/p/6911166.html 之前这里有个小小例子&#xff0c; 这里只要是总结一下。 HTTP::UserAgent包含了以下模块: ---------------------------------------------------------------------------------------------- Module |Path-Nam…

Java会话技术

会话技术&#xff1a; 会话指的是客户端浏览器和服务端之间的度偶次请求和响应当打开浏览器&#xff0c;访问网站地址后&#xff0c;会话开始&#xff0c;当关闭浏览器&#xff08;或者到了过期时间&#xff09;&#xff0c;会话结束。就像打电话只要不挂电话就是一次会话。 会…

【调用IP宏文件进行仿真】modelsim仿真时出现 Instantiation of 'xxx' failed. The design unit was not found....

出现错误类似&#xff1a;modelsim 仿真fifo时出现 Error: (vsim-3033) E:/Programs/ModelSim/fifo/ps2_fifo.v(75): Instantiation of scfifo failed. The design unit was not found.仿真波形不对&#xff0c;调用的ip核没有输出&#xff08;白色虚线&#xff09;等情况&…

Java Server Page

JSP JSP全称是Java Server Page&#xff0c;基于Java和Servlet一样是sun公司推出的一套开发动态web资源的技术&#xff0c;称为JSP/Servlet规范。JSP的本质其实就是一个Servlet。jsp是一种动态网页技术标准&#xff0c;jsp部署在服务器上可以处理客户端的请求&#xff0c;并根据…

HDFS概述(2)————Block块大小设置

参考&#xff1a;HDFS概述&#xff08;4&#xff09;————HDFS权限HDFS概述&#xff08;3&#xff09;————HDFS FederationHDFS概述&#xff08;2&#xff09;————Block块大小设置HDFS概述&#xff08;1&#xff09;————HDFS架构问题Q: 一个常被问到的一个问题是…

PTA 01-复杂度2 Maximum Subsequence Sum (25分)

题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/663 5-1 Maximum Subsequence Sum (25分) Given a sequence of KK integers { N_1N​1​​, N_2N​2​​, ..., N_KN​K​​ }. A continuous subsequence is defined to be { N_iN​i​​, N_{i1}N​i1​​, ..…

Listener

观察者设计模式&#xff1a; 它是事件驱动的一种体现形式。就好比在做什么事情的时候被人盯着。当对应做到某件事时&#xff0c;触发事件。 观察者模式通常由以下三部分组成&#xff1a; ​1. 事件源&#xff1a;触发事件的对象。 2.​ 事件&#xff1a;触发的动作&#xff0c;…

BZOJ 1083: [SCOI2005]繁忙的都市【Kruscal最小生成树裸题】

1083: [SCOI2005]繁忙的都市 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2925 Solved: 1927[Submit][Status][Discuss]Description 城市C是一个非常繁忙的大都市&#xff0c;城市中的道路十分的拥挤&#xff0c;于是市长决定对其中的道路进行改造。城市C的道 路是这样分…

Mysql介绍与安装LinuxmacOS系统

数据库&#xff1a; 用于存储和管理数据的仓库 数据库的好处&#xff1a; 可以持久化存储数据方便存储和管理数据使用了统一的方式操作数据库 – SQL 常见的数据库&#xff1a; Oracle&#xff1a;收费的大型数据库&#xff0c;Oracle公司的产品。Oracle收购SUN公司&#xff0c…

如何查看Laravel版本号的三种方法

1.PHP artisan --version 2.vim vendor/laravel/framework/src/Illuminate/Foundation/Application.php 3&#xff1a;可以写在路由里 5.4版本的路由文件夹是routes。我们可以写在routes\web.php里。 Route::get(laravel-version, function(){ $laravel app(); return…

最全的Mysql数据类型

数值类型&#xff1a; 类型大小范围&#xff08;有符号&#xff09;范围&#xff08;无符号&#xff09;用途Bit1bytes-128 ~ 120 ~ 255小整数值TINYINT1 byte-128 ~ 1270 ~ 255小整数值SMALLINT2 bytes-32768 ~ 327670 ~ 65535大整数值MEDIUMINT3 bytes-8388608 ~ 83886070 ~…

02_反汇编_反编译

实际上安卓的应用都是zip包,只不过把zip扩展名修改了,修改成了APK.所以如果你想拿到它的图片的话,实际上特别简单&#xff0c;你就把它这个.apk换成.zip.换成.zip之后这里的图片资源就都可以拿到了. 有些公司可能美工的水平或者美工的人数比较少&#xff0c;项目还比较急&#…

SQL约束语法

约束 作用&#xff1a;对表中的数据进行限定&#xff0c;保证数据的正确性、有效性、完整性&#xff01; 约束分类&#xff1a; 约束说明PRIMARY KEY主键约束PRIMARY KEY AUTO_INCREMENT主键、自动增长UNIQUE唯一约束NOT NULL非空约束FOREIGN KEY外键约束FOREIGN KEY ON UPDAT…

hdu 2489 Minimal Ratio Tree

https://vjudge.net/problem/HDU-2489 题意&#xff1a;求一个完全图的最优比率生成树&#xff0c;点的个数由题给出。最优比率生成树是边的权值之和与点的权值之和的比值最小的生成树。 思路&#xff1a;一开始用dfs枚举搜索每一种情况&#xff0c;t了&#xff0c;枚举的情况太…

SQL多表关联

多表关联&#xff1a; 多张数据表之间是可以有一定的关联关系&#xff0c;这种关联关系可以通过外键约束实现 多表的分类&#xff1a; 一对一一对多多对多 一对一&#xff1a; 一张表对应一张表 适用场景举例&#xff1a; 人和身份证。一个人只能有一个身份证&#xff0c;一个身…

背包问题 codevs2210 数字组合

数字组合 题目描述 Description在N个数中找出其和为M的若干个数。先读入正整数N和M&#xff0c; 再读入N个正数&#xff08;可以有相同的数字&#xff0c;每个数字均在1000以内&#xff09;&#xff0c; 在这N个数中找出若干个数&#xff0c; 使它们的和是M&#xff0c; 把满足…