Python基础(二十一):面向对象深入了解

面向对象深入了解

一、魔法方法

在Python中, __xx__() 的函数叫做魔法方法,指的是具有特殊功能的函数。

1、__init__()

体验__init__()

思考:洗衣机的宽度高度是与生俱来的属性,可不可以在生产过程中就赋予这些属性呢?

答:理应如此。

__init__() 方法的作用:初始化对象。

class Washer():
 
    # 定义初始化功能的函数
    def __init__(self):
        # 添加实例属性
        self.width = 500
        self.height = 800
    def print_info(self):
        # 类⾥⾯调⽤实例属性
        print(f'洗衣机的宽度是{self.width}, ⾼度是{self.height}')
haier1 = Washer()
haier1.print_info()

注意: __init__() 方法,在创建⼀个对象时默认被调⽤,不需要手动调用 __init__(self) 中的self参数,不需要开发者传递,python解释器会自动把当前的对象引 ⽤传递过去。

带参数的__init__()

思考:⼀个类可以创建多个对象,如何对不同的对象设置不同的初始化属性呢?

答:传参数。

class Washer():
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    def print_info(self):
        print(f'洗衣机的宽度是{self.width}')
        print(f'洗衣机的⾼度是{self.height}')

haier1 = Washer(10, 20)
haier1.print_info()

haier2 = Washer(30, 40)
haier2.print_info()

2、__str__()

当使用print输出对象的时候,默认打印对象的内存地址。如果类定义了 __str__ 方法,那么就会打印从在这个方法中 return 的数据。

class Washer():
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    def __str__(self):
        return '这是海尔洗衣机的说明书'

haier1 = Washer(10, 20)
# 这是海尔洗衣机的说明书
print(haier1)

3、__del__()

当删除对象时,python解释器也会默认调用__del__() 方法。

class Washer():
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def __del__(self):
        print(f'{self}对象已经被删除')
haier1 = Washer(10, 20)
# <__main__.Washer object at 0x000001E02D665588>对象已经被删除
del haier1

二、综合应用

1、烤地瓜

1.1、需求

需求主线:

被烤的时间和对应的地瓜状态:

0-3分钟:生的

3-5分钟:半生不熟

5-8分钟:熟的

超过8分钟:烤糊了

添加的调料:

用户可以按自己的意愿添加调料

1.2、步骤分析

需求涉及⼀个事物: 地瓜,故案例涉及⼀个类:地瓜类。

1.2.1、定义类

地瓜的属性

  • 被烤的时间
  • 地瓜的状态
  • 添加的调料

地瓜的方法

被烤

  • 用户根据意愿设定每次烤地瓜的时间
  • 断地瓜被烤的总时间是在哪个区间,修改地瓜状态

添加调料

  • 用户根据意愿设定添加的调料
  • 将用户添加的调料存储

显示对象信息

1.2.2、创建对象,调用相关实例方法

1.3、代码实现

1.3.1、定义类

地瓜属性

  • 定义地瓜初始化属性,后期根据程序推进更新实例属性
class SweetPotato():
    def __init__(self):
        # 被烤的时间
        self.cook_time = 0
        # 地⽠的状态
        self.cook_static = '⽣的'
        # 调料列表
        self.condiments = []

1.3.2、定义烤地瓜方法

class SweetPotato():


    def cook(self, time):
        """烤地⽠的⽅法"""

        self.cook_time += time
        if 0 <= self.cook_time < 3:
            self.cook_static = '⽣的'
        elif 3 <= self.cook_time < 5:
            self.cook_static = '半⽣不熟'
        elif 5 <= self.cook_time < 8:
            self.cook_static = '熟了'
        elif self.cook_time >= 8:
            self.cook_static = '烤糊了'

1.3.3、书写str魔法方法,用于输出对象状态

class SweetPotato():
 
    def __str__(self):
        return f'这个地⽠烤了{self.cook_time}分钟, 状态是{self.cook_static}'

1.3.4、创建对象,测试实例属性和实例方法

digua1 = SweetPotato()
print(digua1)
digua1.cook(2)
print(digua1)

1.3.5、定义添加调料方法,并调用该实例方法

class SweetPotato():

    def add_condiments(self, condiment):
        """添加调料"""
        self.condiments.append(condiment)

    def __str__(self):
        return f'这个地⽠烤了{self.cook_time}分钟, 状态是{self.cook_static}, 添加的调料有{self.condiments}'

digua1 = SweetPotato()
print(digua1)
digua1.cook(2)
digua1.add_condiments('酱油')
print(digua1)
digua1.cook(2)
digua1.add_condiments('辣椒⾯⼉')
print(digua1)
digua1.cook(2)
print(digua1)
digua1.cook(2)
print(digua1)

1.4、代码总览

# 定义类
class SweetPotato():
    def __init__(self):
        # 被烤的时间
        self.cook_time = 0
        # 地⽠的状态
        self.cook_static = '⽣的'
        # 调料列表
        self.condiments = []
    def cook(self, time):
        """烤地⽠的⽅法"""
        self.cook_time += time
        if 0 <= self.cook_time < 3:
            self.cook_static = '⽣的'
        elif 3 <= self.cook_time < 5:
            self.cook_static = '半⽣不熟'
        elif 5 <= self.cook_time < 8:
            self.cook_static = '熟了'
        elif self.cook_time >= 8:
            self.cook_static = '烤糊了'

    def add_condiments(self, condiment):
        """添加调料"""
        self.condiments.append(condiment)

    def __str__(self):
        return f'这个地⽠烤了{self.cook_time}分钟, 状态是{self.cook_static}, 添加的调料有{self.condiments}'

digua1 = SweetPotato()
print(digua1)
digua1.cook(2)
digua1.add_condiments('酱油')
print(digua1)
digua1.cook(2)
digua1.add_condiments('辣椒⾯⼉')
print(digua1)
digua1.cook(2)
print(digua1)
digua1.cook(2)
print(digua1)

2、搬家具

2.1、需求

将小于房子剩余面积的家具摆放到房子中

2.2、步骤分析

需求涉及两个事物:房子和家具,故被案例涉及两个类:房子类和家具类。

2.2.1、定义类

房子类

实例属性

  • 房子地理位置
  • 房子占地面积
  • 房子剩余面积
  • 房子内家具列表

实例方法

  • 容纳家具

显示房屋信息

家具类

家具名称

家具占地面积

2.2.2、创建对象并调用相关方法

2.3、代码实现

2.3.1、定义类

  • 家具类
class Furniture():
    def __init__(self, name, area):
        # 家具名字
        self.name = name
        # 家具占地⾯积
        self.area = area

  • 房子类
class Home():
    def __init__(self, address, area):
        # 地理位置
        self.address = address
        # 房屋⾯积
        self.area = area
        # 剩余⾯积
        self.free_area = area
        # 家具列表
        self.furniture = []

    def __str__(self):
        return f'房⼦坐落于{self.address}, 占地⾯积{self.area}, 剩余⾯积{self.free_area}, 家具有{self.furniture}'

    def add_furniture(self, item):
        """容纳家具"""

        if self.free_area >= item.area:
            self.furniture.append(item.name)
            # 家具搬⼊后,房屋剩余⾯积 = 之前剩余⾯积 - 该家具⾯积
            self.free_area -= item.area
        else:
            print('家具太大,剩余面积不足,⽆法容纳')

2.3.2、创建对象并调用实例属性和方法

bed = Furniture('双⼈床', 6)
jia1 = Home('北京', 1200)
print(jia1)
jia1.add_furniture(bed)
print(jia1)
sofa = Furniture('沙发', 10)
jia1.add_furniture(sofa)
print(jia1)
ball = Furniture('篮球场', 1500)
jia1.add_furniture(ball)
print(jia1)

运行效果:

本文转载于网络 如有侵权请联系删除

相关文章

  • Intel altera opencl 入门

    大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。 今天给大侠带来Intelalteraopencl入门,话不多说,上货。 概述Intelaltera的OpenCL主要面向信号处理类应用的客户,是用C语言开发FPGA的利器,开放计算语言(OpenCL)联盟著名的公司有FPGA巨头Intelaltera、两大显卡GPU巨头AMD和英伟达、CPU巨头Intel、软件和服务器巨头IBM以及全世界最大的公司Apple(苹果)等等。不过AMD和英伟达是用GPU实现的OpenCL并行运算,Intelaltera是用FPGA实现并行运算。1.系统要求•Microsoft64-bitWindows7专业版或者更高。•对于Windows操作系统,要安装微软公司的VisualStudio2010或者2012专业版(推荐)。或者:•RedHatEnterprise64-bitLinux(RHEL)5或者6。 •对于Linux操作系统,安装操作系统过程中要把C编译器包括GCC勾选上

  • 云通信IM-离线推送收不到问题分析

    问题描述:有客户提工单反馈配置好离线推送后收不到推送消息可能原因:1.手机设置没有打开app通知2.发送消息时MsgLifeTime设置的值是否为0,若设置该字段为0,则消息只发在线用户,不保存离线3.用户状态是否变更到PushOnline4.对于小米离线推送,需要在小米推送运营平台通知类别中添加ChannelID,且保持和控制台证书中ChannelID的一致排查步骤:1.控制台离线推送工具测试是否可以收到离线推送腾讯云官网IM控制台->辅助工具->离线推送自查离线自查工具如果不能成功推送,根据提示信息排查即可,多为状态不是pushonline或证书不正确2.检查消息body中MsgLifeTime设置的值若设置该字段为0,则消息只发在线用户,不保存离线,就无法实现离线推送。发送单聊消息中的请求body字段说明3.查该条消息是否下发调用RestApi查询消息是否成功下发,以下以查询单聊消息为例,群聊可以查询对应的群聊消息查询单聊消息,请注意SyncOtherMachine值若消息成功下发:检查登录态是否为PushOnline,然后再继续发送消息,可以通过在线工具查询账号在线

  • 前端|利用模态框(Modal)实现弹窗效果

    一、弹窗的运用弹窗效果在网页和app中的运用还是比较常见的。每当在手机里下载一个app时,请求获取存储空间和地理位置时,绝大部分都是使用的弹窗。它不仅提醒作用强、节约页面空间,还比较美观。模态框(Modal)是覆盖在父窗体上的子窗体,目的是显示来自一个单独的内容,可以在不离开父窗体的情况下有一些互动(子窗体可提供信息、交互等)。使用模态窗口的时候,一般会用到某种触发器,常用的是按钮或链接。二、模态框(Modal)简单介绍模态框在bootstrap中是一个插件,所以也可以单独引用插件,但是这就需要引用modal.js。但是在本文中还是介绍用bootstrap的写法。模态框作为覆盖在父体窗口上的子窗口,它的窗口设置和常见方法如下图:图2.1窗口设置图2.2常见方法三、制作步骤如下3.1所示效果图,是一个较为完整的页面,这里只展示模态框的相关代码。(1)制作触发器并设计样式。制作如下图3.1所示的模态框,用的是按钮触发器。这里的class="btnbtn-primary",btn它可以表示按钮的基类,btn-primary就是button所生的样式融合(还有input-p

  • H3C AC+FIT完全设置

    路由器:H3CMSR20-20 AC: H3CWX3024EAP:2210-AG      用户采用PON线路,动态分配地址,无固定IP,每月1088元,如果带有固定IP,则需要每月7088元,采用较经济的方式,每次用户查询ip138得到公网IP后远程管理。     MSR上PPPOE拨号,建立2VLAN,一个给内部使用,一个给访客,用访问列表对2Vlan做隔离。具体配置如下:#  firewallenable     必须启用,否则ACL不起作用#  domaindefaultenablesystem #  telnetserverenable   也必须开启 #  darp2psignature-fileflash:/p2p_default.mtd #  port-securityenable # aclnumber3000  rule0permitipsource10.20.0.00.0.255.255      内部用VLAN   rule1permitipsource10.30.30.00.0.0.255        访客用VLAN aclnumber3002 rule0d

  • Python基础篇 strings 03

    Python基础,strings03找出子字符串出现频次和出现的索引位置核查是否存在字符串并找出其索引位置查找所有字符的出现次数和索引找出子字符串出现频次和出现的索引位置使用string.count()计算子字符串出现频次string.count(s,sub[,start[,end]])In[35]:mainStr='Thisisasamplestringandasamplecode.Itisveryshort.' ...: ...:#Gettheoccurrencecountofsub-stringinmainstring. ...:count=mainStr.count('sample') ...: ...:print("'sample'substringfrequency/occurrencecount:",count) 'sample'substringfrequency/occurrencecount:2 复制使用python正则表达式计算出现频次In[36]:importre

  • 【项目实战】自监控-06-DataFrame行列操作(上篇)

    系统:Windows7 语言版本:Anaconda3-4.3.0.1-Windows-x86_64 编辑器:pycharm-community-2016.3.2这个系列主要是实际在做项目的一个笔记自监控项目,主要是对采集的质量监控数据做的一个实时预警今天讲讲如何从DataFrame获取需要到的行或者列主要涉及:loc今日歌曲:Part1:构建一个DataFrame一个DataFrame可以看成一个二维表格,不过这个二维表格有行标题也有列标题,而且每类标题可能不止一级示例中由一个字典构建一个DataFrame通过index参数制定行名称importpandasaspddict1={"a":[1,3,5,6],"b":[11,12,15,16], "c":[22,27,29,30],"d":[82,87,89,80]}df=pd.DataFrame(dict1,index=["x","y","z","q"]) print("

  • springboot配置读写分离

      近日工作任务较轻,有空学习学习技术,遂来研究如果实现读写分离。这里用博客记录下过程,一方面可备日后查看,同时也能分享给大家(网上的资料真的大都是抄来抄去,,还不带格式的,看的真心难受)。完整代码1、背景  一个项目中数据库最基础同时也是最主流的是单机数据库,读写都在一个库中。当用户逐渐增多,单机数据库无法满足性能要求时,就会进行读写分离改造(适用于读多写少),写操作一个库,读操作多个库,通常会做一个数据库集群,开启主从备份,一主多从,以提高读取性能。当用户更多读写分离也无法满足时,就需要分布式数据库了(可能以后会学习怎么弄)。  正常情况下读写分离的实现,首先要做一个一主多从的数据库集群,同时还需要进行数据同步。这一篇记录如何用mysql搭建一个一主多次的配置,下一篇记录代码层面如何实现读写分离。2、搭建一主多从数据库集群  主从备份需要多台虚拟机,我是用wmware完整克隆多个实例,注意直接克隆的虚拟机会导致每个数据库的uuid相同,需要修改为不同的uuid。修改方法参考这个:点击跳转。主库配置 主数据库(master)中新建一个用户用于从数据库(slave)读取主数据库二进制日

  • Sqoop安装

    Sqoop是Hadoop生态里,实现Hive、Hbase等大数据数据库与MySQL、Oracle导入导出的工具。 其实就是包含两部分功能:(1)HDFS的读写能力(2)加载JDBC。 这篇文章记录了配置sqoop的步骤。在实验过程中,遇到了一些ERROR,反复百度也没有找到解决方法。最后,把sqoop安装文件夹删除,wget原始文件,重头配置了一遍,一切都OK了。还是“重装”最好用。 一、下载sqoop1.4.7如图,下载地址很好找。本文还是用sqoop1。下载页面下有两个链接,使用sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz,包含hadoop支持。不要用sqoop-1.4.7.tar.gz。二、下载mysql-connector-java到mysql官网查找mysql-connector/j,下载mysql服务器对应版本5.1.x,platformindependent版。解压之后,拷贝一下两个文件到sqoop安装目录lib.三、修改配置添加环境变量exportSQOOP_HOME="/opt/sqoop" exportPATH=$SQ

  • gsoap开发webservice

    gSOAP编译工具提供了一个SOAP/XML关于C/C++语言的实现,从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多。绝大多数的C++web服务工具包提供一组API函数类库来处理特定的SOAP数据结构,这样就使得用户必须改变程序结构来适应相关的类库。与之相反,gSOAP利用编译器技术提供了一组透明化的SOAPAPI,并将与开发无关的SOAP实现细节相关的内容对用户隐藏起来。gSOAP的编译器能够自动的将用户定义的本地化的C或C++数据类型转变为符合XML语法的数据结构,反之亦然。这样,只用一组简单的API就将用户从SOAP细节实现工作中解脱了出来,可以专注与应用程序逻辑的实现工作了。gSOAP编译器可以集成C/C++和Fortran代码(通过一个Fortran到C的接口),嵌入式系统,其他SOAP程序提供的实时软件的资源和信息;可以跨越多个操作系统,语言环境以及在防火墙后的不同组织。gSOAP使编写web服务的工作最小化了。gSOAP编译器生成SOAP的代码来序列化或反序列化C/C++的数据结构。gSOAP包含一个WSDL生成器,用它来为你的web服务生成web服务

  • Python学习教程 (四)

    Python教程欢迎来到Python的世界,本教程将带你遨游Python,领悟Python的魅力。本教程专注于帮助初学者,尤其是生物信息分析人员快速学会Python的常用功能和使用方式,因此只精选了部分Python的功能,请额外参考Python经典教程Abyteofpython和它的中文版来更好的理解Python.本文档的概念和文字描述参考了Abyteofpython(中文版),特此感谢。ThisworkislicensedunderaCreativeCommonsAttribution-NonCommercial-ShareAlike2.0GenericLicense.实战练习(一)背景知识1.FASTA文件格式>seq_name_1 sequence1 >seq_name_2 sequence22.FASTQ文件格式@HWI-ST1223:80:D1FMTACXX:2:1101:1243:22131:N:0:AGTCAA TCTGTGTAGCCNTGGCTGTCCTGGAACTCACTTTGTAGACCAGGCTGGCATGCA + BCCFFFFFFHH#4AFHIJ

  • Apache实现反向代理负载均衡

    说到负载均衡LVS这套技术,有很多种实现方法。本文所说,主要就是利用apache服务器实现反向代理,实现负载均衡。首先,传统的正向代理如下图所示,正如我们用的游戏加速代理,大多的个人PC把请求发给正向代理服务器,代理服务器通常配置高端的带宽,替我们请求相应的服务。而负载均衡中的反向代理,通常意义上,是一个请求转发的代理。类似一个收发室的管理人员,外来的很多邮件,传到收发室,然后由管理员分配给不同的办公室。通过这样的操作,可以使每台服务器避免过多的负载导致宕机。而转发的这个过程,通常也有很多种不同的算法。下图所示,就是一个反向代理的过程:实现这样一个架构,需要几台服务器,不论是linux或者windows都可以实现。如果如图所示,实现,则需要四台服务器,1台apache反向代理服务器,实现请求的转发分配。3台后台的主服务器。在apache代理服务器上面,如果安装的centos系统,那么自带的httpd服务,就不用再安装apache服务器了。它的apache服务器的配置文件在/etc/httpd/conf/httpd.conf文件中,可以通过vi命令打开。1确保需要的mod_proxy模块

  • idea设置新增文件,自动添加到git

    作者:经典鸡翅 微信公众号:经典鸡翅 如果你想及时得到个人撰写文章,纯java的面试资料或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号)。

  • 构建具有用户身份认证的 Ionic 应用

    序言:本文主要介绍了使用Ionic和Cordova开发混合应用时如何添加用户身份认证。教程简易,对于Ionic入门学习有一定帮助。因为文章是去年发表,所以教程内关于Okta的一些使用步骤不太准确,但是通过Okta的官网也可以找到对应的内容。另外,使用npm安装Ionicstarter模板可能会有安装失败的情况,建议不要在这方面浪费太多时间,可以直接在Ionic的GitHub仓库中下载starter模板。 原文:HowtoSprinkleReactJSintoanExistingWebApplication 译者:nzbin 使用Okta和OpenIDConnect(OIDC),可以很轻松的在Ionic应用中添加身份认证,完全不需要自己实现。OIDC允许你直接使用OktaPlatformAPI进行认证,本文的目的就是告诉你如何在一个Ionic应用中使用这些API。我将演示如何使用OIDC重定向、Okta的AuthSDK以及基于Cordova内嵌浏览器的OAuth进行登录;由于功能还在开发中,所以省略了用户注册。 为什么使用Ionic? Ionic是一个用于开发原生及先进web应用的

  • 百度小程序优化总结

    小程序优化背景   更换版本频繁:因合规要求,5次区别较大的版本更换,立马就换了就没来得及优化   内容要求过大:例如首页过长导致短期内无法满足性能要求   百度小程序对程序要求非常苛刻:   白屏定义为打开后6s,页面还是空白的, 百度要求要≤1%   开发测试的时候肯定都是达标的,线上百分之一是个长尾数据,受限制与多方面影响,客户移动网络的不稳定性、手机性能差异   只有让自己的小程序性能足够好,从而减少长尾量。   总之,这是个综合工作,需要不断推进,版本不要变动,优化才能持续   1优化准则   1.1 前端     控制资源(大小,数量),默认数据占位,懒加载   1.2后端:API接口响应时间基线标准     ①任意C端API接口响应时间控制在500ms(0.5s)内     ②任意后台API接口响应时间控制在3000ms(3s)内     ③高频(TOP10)C端API接口响应时间必须控制在300ms(0.3s)内     ④高频(TOP10)后台API接口响应时间必须控制在1500ms(1.5s)内     ⑤如果因为业务实际情况,或者优化

  • Android版Ftp服务端软件

    业余时间做的Android版Ftp服务端软件,支持Android4.0及以上版本,可以实现局域网无线传输文件到手机,或者把手机上的多媒体文件分享到iPad等设备来扩展这些设备的存储空间,详情请见软件的使用帮助,截图如下: iPad等设备播放手机上的多媒体文件:   下载地址:http://pan.baidu.com/s/1sjlZBzR   更新:修复部分android设备在使用热点共享时,不能正确获取IP地址的问题。 下载地址:http://pan.baidu.com/s/1hqLgw1u  提取码:cpfx

  • Android Studio打包未签名包

    AndroidStudio打包未签名包 好久没有写技术博客了,真有点懈怠了,作为35岁的程序员,转行重新捡起这些知识,还是挺犹豫纠结的,不过没啥其它办法,一点一滴开始吧,今天这开篇就小结点前几天工作中遇到的关于如何通过AndroidStudio打包未签名包。 打包未签名包 因为并不是从基础一步一步学起的,所以很多东西都是现有工程结合网上知识混着用一下,能解决问题就行了,现在的程序员,特别是小公司的程序员,一般能找到现成解决方案实现项目需求就可以了。哪有那么多时间去一步一步分析每一行代码的来由呢。转战AndroidStudio,还是参照AndroidStudio系列教程六--Gradle多渠道打包来编写build.gradle文件的,平时打包也好好的,突然来个需求说是要打包一个为签名包,第一反应居然不是修改build.gradle,而是去上网搜索,结果五花八门的答案啊。连stackoverflow上的Android:BuildUnsignedAPKwithGradle对我来说也是不适用,不过根据他的原理,我就想着干脆把build.gradle文件中“buildTypes”的“releas

  • ECMAScript6-let与const命令详解

    前言 《ECMAScript入门》是一本开源的JavaScript语言教程,全面介绍ECMAScript6新引入的语法特性。 let和const命令,是第一章开始介绍,也是比较基础的知识。我在学习之后,把它总结记录下来,以便自己以后复习查看。 以下代码,于Chrome57DevTools运行 node为6.3版本 先总结 先总结区别,再分别阐述 let与const相同点和区别 1:let命令用来声明变量,用法类似于var,但是所声明的变量。 const声明一个只读的常量,一旦声明,常量的值就不能改变。 const保证的是内存地址不得改动。常量(内存地址保存的是值),复合类型的数据(内存地址保存的是指针) 2:两者都不存在变量提升。 3:两者都有暂时性死区(TDZ)。 4:两者都不允许重复声明。 5:两者为JavaScript新增了块级作用域。两者作用域,只在声明所在的块级作用域有效。 基本用法 let命令介绍 let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。 浏览器中的结果 上面代码在代码块之中,分别用let和var声明了两个变量。然

  • opcache分享

      opcache的技术分享ppt,独家唯一经过自己实验的分享 https://pan.baidu.com/s/1-73-QHOSeet7tcR81gto6Q ----------------------------------------------- CreatedBy王滔专注于互联网系统开发 原创文章,转载注明出处, -----------------------------------------------

  • Spring Security 源码学习(三): Spring Security认证流程

    【参考文章】:SpringSecurity认证流程(写的很形象) 认证功能由springSecurityFilterChain中的UsernamePasswordAuthenticationFilter实现 认证流程 UsernamePasswordAuthenticationFilter创建一个未认证的Authentication,然后交给AuthenticationManager进行认证 AuthenticationManager的默认实现ProviderManager管理负责认证的AuthenticationProvider,然后遍历AuthenticationProvider,如果这个AuthenticationProvider支持这种类型的认证,将未认证信息交给AuthenticationProvider处理认证 认证成功则会返回一个通过认证的Authentication对象,否则抛异常表示认证失败 1.AbstractAuthenticationProcessingFilter(认证入口) 该类下有三个子类,子类都没有重写doFilter(),都是调用父类的doFilt

  • 证券公司---投行/券商

    证券 证明持有人依法享有某种收益(权益)的法律凭证,包括: 产权--股票 债券---债券 衍生品--期权(行使合约权)等 混合型--基金型(包括股票、债券、房地产等) 证券公司 欧美叫投行,中日叫券商,也叫证券公司,比如,中信证券、海通证券等。 主要业务 提供证券经纪(简单说就是代理股票买卖,客户是散户和基金等机构)、 投行业务(企业IPO、重组并购、债券发行和承销等)、 资产管理(就是说拿客户的资金去投资,收益分配给客户)、 自营(拿自己的钱去投资)、 研究所(提供卖方的行研报告)。 基金公司分为公募基金和私募基金, 公募基金传统上只是做证券投资,比如股票、债券等。比如华夏基金、博时基金等。 而私募基金分为私募证券投资基金和私募股权基金,前者主要投资证券市场,比如泽熙;后者主要投资于非上市公司的股权,比如九鼎投资等,国外的像红杉之类的。 投行/券商与商行的区别 功能角色:投行--金融中介;商行---信用中介 主要业务:投行----资产证券化、证券经纪、公司并购、资产重组、公司理财、财务咨询、项目融资、风投、行研等;商行---吸收存款、发放贷款 融资方式不同(对投资人而言):

  • python--004--函数(其他内置函数)

    其它内置函数 1)ord()与chr相反复制 print(chr(97)) print(ord('a')) output: a 97复制 2)pow复制 print(pow(3,3))#相当于3**3 print(pow(3,3,2))#相当于3**3%2 output: 27 1复制 3)repr--打印复制 4)reversed()复制 l=[1,2,3,4] print(list(reversed(l))) print(l) output: [4,3,2,1] [1,2,3,4]复制 5)round()复制 print(round(3.5))#四舍五入 output: 4复制 6)set('hello')#集合复制 7)slice()切片复制 l='hello' #print(l[3:5])#硬编码 s1=slice(3,5,1) print(l[s1]) print(s1.start) print(s1.stop) print(s1.step) output: lo 3 5 1复制 8)sorted排序,复制 排序的本质就是在比较大小,不同类型之间不可

相关推荐

推荐阅读