python面向对象三大特性、类的约束、print带颜色输出及super补充

面向对象三大特性、类的约束、print带颜色输出及super补充

简述:

python面向对象的三大特性:

1.继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类,继承:是基于抽象的结果,通过编程语言去实现它,肯定是先经历抽象这个过程,才能通过继承的方式去表达出抽象的结构。抽象只是分析和设计的过程中,一个动作或者说一种技巧,通过抽象可以得到类

2.封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。

3.多态指的是一类事物有多种形态

继承

上篇博客已做阐述

封装

在使用面向对象封装特性时,大致分两个步骤:

1.将内容封装到某处;

class Foo:def __init__(self,name,age):   # 称为构造方法,根据类创建对象自动执行self.name = nameself.age = age
obj1 = Foo("alex",18)   # 将alex 和18 分别封装到obj1的name和age属性中
obj2 = Foo("taibai",30)   # 将taibai 和30分别封装到obj2的name和age属性中

self为一个形式参数,接收obj1和obj2对象内存地址,当实例化对象时,对象属性内容被封装到obj1和obj2中,每个对象中都有name和age属性

2.从某处调用被封装的内容

调用封装内容时,有两种情况:

1.通过对象直接调用

class Foo:def __init__(self,name,age):self.name = nameself.age = age
obj1 = Foo("alex",18)
print(obj1.name)
print(obj1.age)obj2 = Foo("taibai",20)
print(obj2.name)
print(obj2.age)
# 通过对象直接调用被封装的内容

2.通过self间接调用

执行类中的方法时,需要self间接调用被封装的内容

class Foo:sef __init__(self,name,age):self.name =nameself.age = agedef detail(self):print(self.name)print(self.age)
obj1 = Foo("alex",18)
obj1.detail() # python默认会将obj1传给self参数,此时detail中的self为obj1
obj2 = Foo("taibai",30)
obj1.detail() # python默认会将obj1传给self参数,此时detail中的self为obj2

综上所述,对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封装的内容。

多态

多态,同一个对象,多种形态。python默认支持多态。

# 在java或者c#定义变量或者给函数传值必须定义数据类型,否则就报错。def func(int a):print('a必须是数字')# 而类似于python这种弱定义类语言,a可以是任意形态(str,int,object等等)。
def func(a):print('a是什么都可以')# 再比如:
class F1:passclass S1(F1):def show(self):print 'S1.show'class S2(F1):def show(self):print 'S2.show'# 由于在Java或C#中定义函数参数时,必须指定参数的类型
# 为了让Func函数既可以执行S1对象的show方法,又可以执行S2对象的show方法,所以,定义了一个S1和S2类的父类
# 而实际传入的参数是:S1对象和S2对象def Func(F1 obj):
"""Func函数需要接收一个F1类型或者F1子类的类型"""print obj.show()s1_obj = S1()
Func(s1_obj)  # 在Func函数中传入S1类的对象 s1_obj,执行 S1 的show方法,结果:S1.shows2_obj = S2()
Func(s2_obj)  # 在Func函数中传入Ss类的对象 ss_obj,执行 Ss 的show方法,结果:S2.showPython伪代码实现Java或C  # 的多态

鸭子类型

class A:def f1(self):print('in A f1')def f2(self):print('in A f2')class B:def f1(self):print('in A f1')def f2(self):print('in A f2')obj = A()
obj.f1()
obj.f2()obj2 = B()
obj2.f1()
obj2.f2()

A和B两个类完全没有耦合性,但在某种意义上却统一了一个标准

相同的功能设定了相同的名字,这样便于开发,这两个方法就互为鸭子类型

类的约束

这里所指的约束是对类的约束

对类的约束的两种方法:

  1. 提取⽗类. 然后在⽗类中定义好⽅法. 在这个⽅法中什么都不⽤⼲. 就抛⼀个异常就可以了. 这样所有的⼦类都必须重写这个⽅法. 否则. 访问的时候就会报错.
  2. 使⽤元类来描述⽗类. 在元类中给出⼀个抽象⽅法. 这样⼦类就不得不给出抽象⽅法的具体实现. 也可以起到约束的效果.

第一种方法:

class Payment:def pay(self,money):raise Exception("你没有实现pay方法")  # 下面几个类的父类,指定标准,继承该基类的子类中必须定义pay方法,否则继承此基类pay方法主动抛出异常
class QQpay(Payment):def pay(self,money):print(f"使用QQ支付{money}元")
class Alipay(Payment):def pay(self,money):print(f"使用阿里支付{money}元")
class Wechat(Payment):def fuqian(self,money):print(f"使用微信支付{money}元")
def pay(obj,money):obj.pay(money)
a = Alipay()
b = QQpay()
c = Wechatpay()
pay(a,100)
pay(b,200)
pay(c,300)

第二种方法:引入抽象类的概念进行处理

from abc import ABCMeta,abstractmeethod
class Payment(metaclass = ABCMeta):   # 抽象类 接口类  规范和约束  metaclass指定的是一个元类@abstractmethoddef pay(self):pass  # 抽象方法
class QQpay(Payment):def pay(self,money):print(f"使用QQ支付{money}元")
class Alipay(Payment):def pay(self,money):print(f"使用阿里支付{money}元")
class Wechat(Payment):def fuqian(self,money):print(f"使用微信支付{money}元")
def pay(obj,money):obj.pay(money)
w = Wechatpay()
pay(w,100)

super补充

class A:   # 1def f1(self):  # 2print('in A f1')def f2(self):  # 3print('in A f2')  # 9class Foo(A):  # 4def f1(self):  # 5super().f2()  # 8  super(Foo,self).f2() obj对象内无f2 方法,在其父类A中查找print('in A Foo') # 10obj = Foo()  # 6  实例化对象obj,并将obj的内存地址传给self
obj.f1()  # 7
# 结果:
'in A f2'
'in A Foo'
class A:  # 1def f1(self): # 2print('in A')class Foo(A): # 3def f1(self): # 4super().f1()  # 12  super(Foo,self).f1()print('in Foo') #  14class Bar(A):  # 5def f1(self):  # 6print('in Bar')  # 13class Info(Foo,Bar): # 7def f1(self):  # 8super().f1()  # 11  self为Info,对象空间f1方法,按照mro算法执行Info下一个Foo  super(Info,self).f1()print('in Info f1') # 15obj = Info() # 9 实例化对象
obj.f1() # 10 
# 结果:
'in Bar'
'in Foo'
'in Info f1'
class A: # 1def f1(self): # 2print('in A')class Foo(A): # 3def f1(self): # 4super().f1()print('in Foo')class Bar(A): # 5def f1(self): # 6print('in Bar') # 12class Info(Foo,Bar): # 7def f1(self): # 8super(Foo,self).f1() # 11 按照mro算法执行Foo下一个Bar.f1()print('in Info f1') # 13obj = Info() # 9
obj.f1() # 10
# 结果:
'in Bar'
'in Info f1'

print带颜色输出

书写格式: 开头部分:\033[显示方式;前景色;背景色m + 结尾部分:\033[0m

开头部分的三个参数:显示方式,前景色,背景色是可选参数,可以只写其中的某一个;另外由于表示三个参数不同含义

的数值都是唯一的没有重复的,所以三个参数的书写先后顺序没有固定要求,系统都能识别;但是,建议按照默认的格式

规范书写。对于结尾部分,其实也可以省略,但是为了书写规范,建议\033[***开头,\033[0m结尾。

字体色背景色颜色描述
3040黑色
3141红色
3242绿色
3343黃色
3444蓝色
3545紫红色
3646青蓝色
3747白色
显示方式效果
0终端默认设置
1高亮显示
4使用下划线
5闪烁
7反白显示
8不可见
22非粗体
24非下划线
25非闪烁
27非反显

常见开头格式

\033[0m 默认字体正常显示,不高亮

\033[32;0m 红色字体正常显示

\033[1;32;40m 显示方式: 高亮 字体前景色:绿色 背景色:黑色

\033[0;31;46m 显示方式: 正常 字体前景色:红色 背景色:青色

转载于:https://www.cnblogs.com/lifangzheng/p/11317813.html

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

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

相关文章

dayjs也可回显AntD DatePicker的值

遇到的问题:react 使用AntD 表单里有多个RangePicker,查看修改时要回显值。 antd的DatePicker需要的是moment对象。但是项目里引的是dayjs库 解决方式: 方式一:直接多引moment.js库,字符串转moment对象 moment(2022-02) 方式二:不甘心引两…

打造“神犇”是教育的未来吗?

这年头,品学兼优、身怀特长的“神犇”,拼的不仅是天赋异禀和后天努力,更是身后爹妈的钱包,而本该实现社会公平的教育,反而加速和凝固了社会的不公。 高等教育的终极目标真的是造就学业超人吗?《纽约时报》刊…

洛谷 P3243 【[HNOI2015]菜肴制作】

第一眼看到这题,顿时懵逼,一个 \(SB\) 拓扑序竟然是黑题,当场笑喷。 \(Of\) \(course\),这题我是用堆做的。(其实是优先队列,手写堆这么垃圾我怎么可能会用呢) \((1)\) 首先建图。如果 \(x\) 需…

AntD 官网样例 InputRef报错原因

在官网可编辑表格typescript样例里 const inputRef useRef<InputRef>(null); InputRef项目报错原因是ant design的版本问题! antd 4.19版本重写了input 可通过InputRef来使用input组件的ref

电路原理图检查的十大步骤详解

最近一直在做嵌入式系统&#xff0c;画原理图。最后&#xff0c;为了保证原理图准确无误&#xff0c;检查原理图花费我近两周的时间&#xff0c;在此&#xff0c;把我在检查原理图方面的心得体会总结在此&#xff0c;供大家参考&#xff0c;说得不对的地方欢迎大家指出。 往往我…

亚伦•斯沃茨:怎样有效利用时间

编者按&#xff1a;今天是著名黑客亚伦•斯沃茨&#xff08;Aaron Swartz&#xff09;头七的日子。斯沃茨14岁就参与创造RSS 1.0规格的制定&#xff0c;曾在斯坦福大学就读了一年&#xff0c;是社交新闻网站Reddit的三位创始人之一……斯沃茨自杀时才年仅26岁。这26岁的短暂生命…

AntD 可编辑行表格

本地数据代码模板自用,官网例子改改 // 编辑行的自定义表格 import React, { useState } from "react"; import {Table,Input,InputNumber,Popconfirm,Form,Typography,Divider, } from "antd";interface Item {key: string;name: string;age: number;add…

SharePoint 2013 - System Features

1. Embed Information & Convert to PDF 功能&#xff0c;在文档的preview界面&#xff08;hover panel&#xff09;; 2. Share功能可以选择是否发送邮件 -- Done 4. Shredded Storage, 将文档的内容和每次的更改分开存储&#xff0c;每次只存储更改的内容&#xff0c;而不…

三心二意,助你好运?

经验说&#xff1a;做事要专心致志。 实验说&#xff1a;专心致志常常让人缺少一双发现的眼睛。 专心致志从来都被当做一个美德来歌颂。从来我们就认为要想成为伟大的人就必须要像牛顿老师那样把钟当成吃的放到锅里煮才行&#xff0c;至少至少也得有能在集市上看书的本事。否则…

React Antd Upload自定义上传customRequest

单独的上传图片接口要传参,action方式不太适合,需要使用自定义上传customRequest覆盖 公司代码不可弄,就发一个可用的demo例子 import React, { useState } from "react"; import { render } from "react-dom"; import "antd/dist/antd.css"; i…

HDU 4109 Instrction Arrangement

题目链接&#xff1a;https://vjudge.net/problem/HDU-4109 题目大意 有 N 个指令&#xff0c;标号从 0 ~ N - 1&#xff0c;和 M 个指令间的先后关系&#xff0c;每个关系都有一个权值 w&#xff0c;表示后一个指令在前一个指令开始时间之后 w 纳秒才开始执行。现在要并发执行…

养成一个习惯需要多久?

有人说养成一个习惯需要21天&#xff0c;有人说30天……养成习惯到底需要多少天&#xff1f; _hzw 2012-11-09 18:04又快到年末了。 年初时&#xff0c;你曾许诺要养成一些好习惯&#xff0c;比如要常运动、多读书、少微博。有人说说养成一个习惯只需要坚持21天&#xff1b;21天…

vue3 eslint The template root requires exactly one element问题

vue项目中手动引入eslint npm install eslint --save-dev eslint初始化 npx eslint --init 运行时npm run lint 简单语法问题--fix会自动修复 但是vue3项目出现只能有一个根节点的问题 原因在于 eslintrc.js里extends中plugin:vue/essential的问题 看eslint-plugin-vue官网…

你所知道的学习方法,都是错的!

你所知道的学习方法&#xff0c;都是错的&#xff01; 上课的时候记笔记&#xff1f;哪门功课不行&#xff0c;就集中精力专项突击&#xff1f;自习的时候不要晃&#xff0c;选好一个地儿安安稳稳地待那儿学习&#xff1f;你还在这样学习吗&#xff1f;不要被骗了&#xff1a;这…

BZOJ 1683.City skyline 城市地平线

传送门 从左到右扫一遍&#xff0c;考虑什么时候会和之前形成同一幢房子从而不用统计 显然是当前的高度和之前某个点高度相同&#xff0c;并且它们之间没有更矮的建筑 考虑用一个单调栈维护一个单调上升的房子轮廓&#xff0c;然后对于扫到的每一个高度&#xff0c;看看栈里有没…

Vue3 eslint 编译器宏和 defineProps,defineEmits,no-undef 规则警告

.eslintrc.js修改 定义全局globals module.exports {globals: {defineProps: readonly,defineEmits: readonly,defineExpose: readonly,withDefaults: readonly},env: {browser: true,es2021: true},extends: [plugin:vue/vue3-strongly-recommended, standard],parserOptio…

Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲

Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲 Java生鲜电商平台: 微服务是当前非常流行的技术框架&#xff0c;通过服务的小型化、原子化以及分布式架构的弹性伸缩和高可用性&#xff0c;可以实现业务之间的松耦合、业务的灵活调整组合以及系统的高可用性…

JS两个对象数组过滤掉相同的对象

let arr1 [{uid:1,name:张三},{uid:2,name:李四}]; let arr2 [{id:1,name:张三},{id:2,name:王五,age:23},{id:3,name:罗翔}]; 去掉arr2中包含的arr1相同name的对象: //ES6的方法&#xff0c;得到新数组 const newArr arr2.filter((item) > {return !arr1.some(ele>…

亚伦•斯沃茨:提升时间的品质

亚伦•斯沃茨&#xff1a;提升时间的品质 不休不眠地工作是低效的&#xff0c;怎样发挥时间的最大效率&#xff1f; 伏维阁主 2013-01-18 16:45图片来源&#xff1a;personalitytutor.com &#xff08;亚伦•斯沃茨Aaron Swartz / 文&#xff09;《 怎样有效利用时间 》中给出的…

useEffect中使用异步函数

useEffect是不能直接用 async await 语法糖的 /* 错误用法 &#xff0c;effect不支持直接 async await*/useEffect(async ()>{/* 请求数据 */const res await getData()},[]) useEffect 的回调参数返回的是一个清除副作用的 clean-up 函数。因此无法返回 Promise&#xf…