Python面向对象(上)

Python面向对象(上)

python是一门面向对象的编程语言。何为对象?对象是类的实例。在生活中,任何一个事物都是一个对象,如牡丹花。牡丹花的类是花类,同样属于花类的还有荷花、月季花、金银花、菊花、梅花、兰花等,它们都是花科,但是每一朵花都有不同的枝叶,不同的色彩,不同的长相。这就是花类的各个属性了,如玫瑰花是红色,菊花是黄色……除了属性,对象里还有方法,也就是花儿怎样开花,怎样长出形态等。

我们来剖析一下分数的构成,一个分数由 分子、分母构成,分子在上,分母在下。分子可以取任意整数,分母的值不能等于0。

现在我们就可以创建一个分数类:

class Fraction:

    def __init__ (self, top, bottom):

    self.num = top

    self.den = bottom

 

所有的类都应该写构造方法,在python中,构造方法一般是__init__。Self是一个总是指向对象本身的特殊参数,它必须是第一个形式参数。然而,在调用方法时,从来不需要提供相应的实际参数。

在构造函数中,self.num与self.den定义了分子与分母,也就是说,调用对象时传入的初始值给其二者赋予:

Myfra = Fraction(3, 5)

 

#创建了一个对象Myfra,并给予初始值3和5,对应分子分母,所以为三分之五

如果我们要将此对象的值(也就是三分之五)打印出来,我们则需要定义一个show()方法:

def show(self):

    print(str(self.num)+“/”+ str(self.den))

 

然后我们调用这个方法:

Myfra.show()

 

这样就可以显示出它的值了。但其实我们有更好的实现:

def __str__(self):

    return str(self.num) +“/ ”+str( self.den))

 

因为python中有一套标准方法,我们可以重写它们,也就是重新定义他们,来使我们的程序更加简便。如此调用过程则为:

Myfra = Fraction(3, 5)

print(Myfra)

 

我们可以根据这种方式来重新其他的标准方法,如实现分数之间的加法运算:

def __add__ (self, otherFraction):

    newNum = self.num * otherFraction.den + \

    self.den * otherFraction.num

    newDen = self.den * otherFraction.den

    return Fraction(newNum, newDen)

 

如果要使得两个分数相加,最简单的方法就是:

 

由上式可得上述程序,接着调用:

F1 = Fraction(1,4)

F2 = Fraction(1,2)

F3 = F1 + F2

print(F3)

 

上述程序虽然可以相加,但不是最简分数,我们可以运用欧几里得算法寻得最大公因数(GCD),然后将分子分母分别除以最大公因数,结果就是最简分数。

欧几里得算法中,对于整数m和n,如果m能被n整除,那么它们的最大公因数就是n。如果m不能被n整除,那么结果是n与m除以n的余数的最大公因数。

def gcd(m, n):

    while m % n != 0:

    oldm = m

    oldn = n

    m = oldn

    n = oldm%oldn

    return n

 

我们通过上述程序可以迭代出最大公因数,但是需要注意的是,此程序的分数不能为负数。

#改良版分数的加法

def __add__(self, otherFraction):

    newNum = self.num * otherFraction.den + \

    self.den * otherFraction.num

    newDen = self.den * otherFraction.den

    common = gcd(newNum, newDen)

    return Fraction(newNum // common, newDen // common)

 

为了让两个分数进行比较,还需要怎加一个方法,我们可以通过重写内置方法__eq__来实现。

def __eq__(self, other):

    firstNum = self.num * other.den

    secNum = other.num * self.den

    return firstNum == secNum

 

如果我们没有重写__eq__方法,那么默认比较的是两个对象实例,如果是指向同一个实例的对象,那么他们两个才能相等,这被称为浅相等。而我们重写后,两个对象只有值相同时,才是相等的,这被称为深相等

所有代码如下:

class Fraction:
    def __init__(self, top, botton):
        self.num = top
        self.den = botton

    def __str__(self):
       return str(self.num) + "/" + str(self.den)

    def __add__(self, otherFraction):
        newnum = self.num * otherFraction.den + self.den * otherFraction.num
        newden = self.den * otherFraction.den

        common = gcd(newnum, newden)

        return Fraction(newnum // common, newden // common)

    def __eq__(self, otherFraction):
        firstnum = self.num * otherFraction.den
        secnum = self.den * otherFraction.num

        return firstnum == secnum

def gcd(m, n):
    while m % n != 0:
        oldm = m
        oldn = n
        m = oldn
        n = oldm % oldn
    return n

if __name__ == '__main__':
    f1 = Fraction(3, 4)
    f2 = Fraction(3, 4)
    f3 = f1 + f2
    print(f3)
    print(f1 == f2)

    f4 = Fraction(4, 8)
    f5 = Fraction(2, 4)
    print(f4 == f5)
    print(f4 + f5)

 

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

相关文章

  • 0891-CDP Private Cloud Base 7.1.8正式GA

    八月再见,九月你好,今天是九月一日,新学年开始,Cloudera正式发布CDPBase7.1.8和ClouderaManager7.7.1。这个版本引入了诸多新功能,比如通过EC提升Ozone的存储效率,ClouderaManager的HA,多NameNode支持,全面支持Impala4.0,Hive性能提升,HDFS/SchemaRegistry血缘功能的增强,改进RangerRMS,以及实时平台的全面增强。1.平台支持增强1.新的操作系统支持 CDPPrivateCloudBase现在支持RHEL/OEL8.6forx86 2.新的元数据库支持CDPPrivateCloudBase现在支持MariaDB10.62.一般功能增强1.ClouderaManagerClouderaManagerHA:你可以通过安装一个负载均衡工具,并设置一些额外的配置,从而实现ClouderaManager主备(Active-Passive)方式的高可用。ClouderaManagerSecureCredentialStore:你可以通过配置CredentialStorageProvider(CSP)来

  • 在 NgModule 里通过依赖注入的方式注册服务实例

    下面是在NgModule中注册一个service的典型例子。import{NgModule}from'@angular/core'; import{AuthService}from'./auth.service'; @NgModule({ providers:[AuthService], }) classExampleModule{}复制上面的代码,因为provide和useClass属性值都相同,所以其实是简写形式(shorthand),完整的写法:import{NgModule}from'@angular/core'; import{AuthService}from'./auth.service'; @NgModule({ providers:[ { provide:AuthService, useClass:AuthService, }, ], }) classExampleModule{}复制对象中的provide属性是我们正在注册的提供者的令牌。这意味着Angular可以使用useClas

  • VMware-使用 VMware Workstation 15.5 Player 替换 VMware Workstation Pro

    下载安装VMware-player-15.5.0-1466586和VisualC++依赖如果安装的过程中提示请移步:戳这里选择对应的版本,下载安装,重启操作系统后,继续安装 安装后,没有序列号的话,选择安装后,加载原来的虚机即可VMwareWorkstationPlayerVSVMwareWorkstationProVSVMwareWorkstationPro:商业软件,付费,功能强大,体积较大VmwarePlayer:体积更小巧,完全免费,感觉和VirtualBox类似,并且新版本已经支持新建虚拟机,更适合个人使用

  • Java-多线程框架Executor

    文章目录概述Executor框架简介Executor框架的两级调度模型Executor框架成员任务执行任务异步计算的结果Executor框架的类与接口使用Executor框架Executors工厂方法newFixedThreadPool固定大小的线程池newSingleThreadExecutor单线程的线程池newCachedThreadPool可缓存的线程池newSingleThreadScheduledExecutornewScheduledThreadPool定时任务调度的线程池实例newFixedThreadPool示例newSingleThreadExecutor示例newCachedThreadPool示例newSingleThreadScheduledExecutor示例newScheduledThreadPool示例概述在Java中,使用线程来异步执行任务。Java线程的创建与销毁需要一定的开销,如果我们为每一个任务创建一个新线程来执行,这些线程的创建与销毁将消耗大量的计算资源。同时,为每一个任务创建一个新线程来执行,这种策略可能会使处于高负荷状态的应用最终崩溃。Ja

  • 基因表达聚类分析之初探SOM - 自组织特征图

    SOM分析基本理论SOM(Self-OrganizingFeatureMap,自组织特征图)是基于神经网络方式的数据矩阵和可视化方式。与其它类型的中心点聚类算法如K-means等相似,SOM也是找到一组中心点(又称为codebookvector),然后根据最相似原则把数据集的每个对象映射到对应的中心点。在神经网络术语中,每个神经元对应于一个中心点。与K-means类似,数据集中的每个对象每次处理一个,判断最近的中心点,然后更新中心点。与K-means不同的是,SOM中中心点之间存在拓扑形状顺序,在更新一个中心点的同时,邻近的中心点也会随着更新,直到达到设定的阈值或中心点不再有显著变化。最终获得一系列的中心点(codes)隐式地定义多个簇,与这个中心点最近的对象归为同一个簇。SOM强调簇中心点之间的邻近关系,相邻的簇之间相关性更强,更有利于解释结果,常用于可视化网络数据或基因表达数据。EventhoughSOMissimilartoK-means,thereisafundamentaldifference.CentroidsusedinSOMhaveapredeterminedtopog

  • 揭秘儿童节刷爆朋友圈的童年美照背后的AI技术!

    你还记得儿童节朋友圈分享的童年美照吗?此款小游戏是由腾讯云神图与腾讯优图联合推出,主要运用了人像变换+人脸融合两项技术相结合。深受泛娱乐场景喜爱的人脸特效产品,在不断的尝试和拓展中已挖掘出很多火爆的玩法及积累了不少优秀落地案例。但同时也会面临些问题,比如,如何在保证算法效果的同时兼顾性能质量?如何平衡用户体验和成本?本次分享以人脸特效产品(人脸试妆包括唇色和美颜、人像变换包括变年龄和变性别)为例,分享在实际场景中遇到的问题和解决方案。您将收获:1.AI潮流:火爆的人脸特效2.人脸特效的AI技术原理3.人脸特效服务架构(1)服务基本框架和流程(2)服务性能和可用保障4.人脸特效应用(1)人脸特效使用简介(2)人脸特效案例分享5.AI技术应用展望更多直播预告:本次直播联合腾讯优图实验室、腾讯多媒体实验室、腾讯未来网络实验室、腾讯量子实验室四大科技实验室,为大家送上一场新技术浪潮的直播盛宴。6月10日~6月19日,9场超干货实战、一线重磅嘉宾分享,观看直播还有机会赢取丰厚礼品:鹅厂定制盲盒、异步社区、当当提供的技术图书、程序员周边好礼……等你来约!如何做一次深度满意度调研从微信支付看研发如何

  • 圆曾经的小车梦,造一台智能小车(四)之QT上位机控制小车

    QT控制界面大致如下,非常简单: 包含前进、后退、左转、右转4个按钮,外加一个显示如何来实现呢?很简单。一、分别拖四个QPushButton按钮过去改成自己想要表达的方式二、再拖一个textBrowser三、设置按钮转到槽主要是设置按钮的具体功能,比如单击、按下,释放等等,当发现这些动作的时候就会触发对应的槽函数。鼠标右键对应的按钮,然后选择转到槽这里我们分别选择pressed()和released()这两个信号,意思是按下和释放,然后点击OK,程序就会自动生成对应的槽函数,依次类推,我们为前进、后退、左转、右转这四个按钮都这么来设置。 由于我们要控制的是Wifi小车,所以需要在.pro中包含:network网络模块QT+=coreguinetwork 复制接下来看mainwindow.h#ifndefMAINWINDOW_H #defineMAINWINDOW_H #include<QMainWindow> //包含对应的头文件 #include<QTcpSocket> #include<QDebug> #include<QString&g

  • [- Flutter 数据&状态篇 -] setState

    0.1:对我而言,一个产品有四层境界1.造都造不出来 2.它又不是不能用<---- 3.用的时候大家都不说话 4.如丝般顺滑,易拓展,易修改,易复用 复制0.2:要说的话注意:本篇是对状态最基本的使用。虽然比较糙,但是并不代表不重要 后面两篇是基于此篇的优化,所以这篇一定要看懂,才能跟上我的思维。 效果如下,单从界面上来看,我还是比较满意的。 0.3:简介一下本项目主要包括以下几点: 1.输入一个待办事项,下面的ListView动态更新 2.条目的复选框选中,条目的文字自动添加下划线 3.条目的复选框非选中,条目的文字自动取消下划线 4.三个按钮会根据是否完成而过滤数据,显示相应条目 复制1.静态界面的实现万里长征第一步,当然是先把静态界面搞出了。 import'package:flutter/material.dart'; classTodoListextendsStatefulWidget{ @override _TodoListStatecreateState()=>_TodoListState(); } class_TodoListState

  • 有些话想和Java程序员说!

    1、要看源码很多大厂都喜欢招看过源码的程序员,很多面试过程中都会深入的问一些源码级别的问题,比如Spring、Dubbo等等这些。其实,并不是说看过源码就代表一个人有多强,只是通过一个人对源码的了解程度,可以看出一个人的技术热情以及钻研能力。正是因为源码比较难看,也比较难坚持,所以看过很多源码的人自然能够脱颖而出。至于看什么,其实并没有特别固定的,很多东西都可以,比如JDK、Junit、开源项目、Spring全家桶、Dubbo、Redis还有就是Mysql、Hotspot等,无论是什么,只要潜下心来看进去就行。2、要有实战经验很多大厂都喜欢问一下实战经验,比如有没有什么性能调优的经验、有没有解决过什么疑难问题的经验等等。之所以问这些,是希望招到一个不仅仅会写CRUD,而且能够进行优化和解决问题的人。这两点其实很重要的,因为CRUD很多人都会写,但是真正遇到性能问题、一致性问题、死锁问题等等的时候,如果开发人员束手无策,那后果还是很严重的。还有的就是比较看重分布式经验、高并发场景的开发经验等。这一点是因为很多大厂有很丰富的分布式、高并发场景,一个有相关背景的人可以快速上手,避免太长时间的

  • File

    File类构造方法File(Fileparent,Stringchild) //根据parent抽象路径名和child路径名字符串创建一个新File实例。 File(Stringpathname) //通过将给定路径名字符串转换为抽象路径名来创建一个新File实例。 File(Stringparent,Stringchild) //根据parent路径名字符串和child路径名字符串创建一个新File实例。 File(URIuri) //通过将给定的file:URI转换为一个抽象路径名来创建一个新的File实例复制File类属性staticStringpathSeparator //与系统有关的路径分隔符,为了方便,它被表示为一个字符串。 staticcharpathSeparatorChar //与系统有关的路径分隔符。 staticStringseparator //与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。 staticcharseparatorChar //与系统有关的默认名称分隔符。复制File类常用方法//通过File对象可以获取访问文件的属性 publi

  • MultiRow发现之旅(七)- 套打和打印

    前文回顾MultiRow发现之旅(一)-高效模板设计器MultiRow发现之旅(二)-详解属性管理器MultiRow发现之旅(三)-模板管理器和TableMultiRow发现之旅(四)-使用MultiRow开发WinForm应用(附源码)MultiRow发现之旅(五)-MultiRow版俄罗斯方块(exe+源码)MultiRow发现之旅(六)-使用MultiRow开发票据应用(附源码)前面的一些文章介绍了如何使用MultiRow设计模板,以及完成一个简单的数据库应用,本文将介绍,在应用设计完成后,你如何使用MulitRow提供的打印功能,按照你的期望,打印到纸张或者其他图形化界面上。首先我们简单来介绍一下MultiRow提供的打印接口,然后着重介绍一些对打印效果的设置。打印接口:在GcMulitRow控件上有面有若个Print方法的重载,还有两个PrintPreview的重载。其中,Print方法支持将GcMulitRow打印到一个Graphics(Print方法的第一个参数为Graphics对象)上面,或者直接输出到打印机,你可以根据不同的需求调用不同的方法重载。这里需要提一下的是,

  • SpEL 表达式_strpbrk函数

    大家好,又见面了,我是你们的朋友全栈君。前言:Spring表达式语言(简称SpEL)是一种与JSP2的EL功能类似的表达式语言,它可以在运行时查询和操作对象图。与JSP2的EL相比,SpEL功能更加强大,它甚至支持方法调用和基本字符串模板函数。SpEL可以独立于Spring容器使用——只是当成简单的表达式语言来使用;也可以在Annotation或XML配置中使用SpEL,这样可以充分利用SpEL简化Spring的Bean配置。注:在Struts笔记中提及的OGNL表达式也是一种与JSP2的EL功能类似的表达式语言,而OGNL并不是真正的编程语言,只是一种数据访问语言。详见:Struts2学习笔记(三)官方教程(spring-framework-4.2.5.RELEASE-dist)可参考:III.CoreTechnologies->9.SpringExpressionLanguage(SpEL)一、使用Expression接口进行表达式求值  Spring的SpEL可以单独使用,可以使用SpEL对表达式计算、求值。SpEL主要提供了如下三个接口(位于org.springframe

  • 多项式全家桶(还有些不会的)

    多项式全家桶 记号约定 \(f^{(i)}(x)\):对\(f(x)\)求\(i\)阶导。 \([x^i]f(x)\):\(f(x)\)的\(i\)次项系数。 多项式微积分 我们知道: \[\begin{aligned} \dfrac{\textrmd}{\textrmdx}x^n&=nx^{n-1}\\ \intx^n\textrmdx&=\dfrac{x^{n+1}}{n+1} \end{aligned} \]以及可加性,于是容易写出代码: #definerep(x,y,z)for(intx=(y);x<=(z);x++) #defineper(x,y,z)for(intx=(y);x>=(z);x--) voidPolyDer(ll*a,ll*b,lln){ rep(i,1,n-1)b[i-1]=a[i]*i%mod; b[n-1]=0; } voidPolyInt(ll*a,ll*b,lln){ rep(i,1,n-1)b[i]=a[i-1]*inv(i)%mod; b[0]=0; } 复制 时间复杂度\(\mathcalO(n)\)。

  • 使用C#重写网上的60行 Javascript 俄罗斯方块源码 (带注释)

    在很久很久以前,就已经看过60行Js的俄罗斯方块源码。无奈当时能力不够看明白,当时觉得就是个神作。 现在总算有空再看了,顺便用c#实现一遍(超过60行),顺道熟悉下JsAPI。 网上其他博客也有分析:教你看懂网上流传的60行JavaScript代码俄罗斯方块游戏  60行JS实现俄罗斯方块,这里就不再详述了,直接上代码。 Tetris.cs 1usingSystem; 2usingSystem.Collections.Generic; 3usingSystem.Linq; 4usingSystem.Text; 5usingSystem.Threading; 6 7namespaceConsoleTetris 8{ 9publicclassBlock 10{ 11publicintx;//本身fk已经记录了方块所在的x坐标,但是为了旋转时方便计算所以新建一个x变量来记录坐标 12publicinty;//方块fk的y坐标 13publicints;//记录方块旋转的index,方便旋转操作查找 14publicint[]fk;//方块??? 15} 16 17pub

  • 写html时css的一些使用习惯

    1、小图标和文字并列,可以文字框架设置padding-left图片显示宽度,图片通过background引入达到并排效果。 div{  padding-left: 0.8rem;  background: url(images/ico.png)no-repeatleftcenter;  background-size: 0.6rem; } 2、div框架高度不确定,子元素浮动,不能设置padding和margin。两个方式: (1)子元素尾加一个子元素清除浮动<divstyle='clear:both;'></div> (2)div框架css设置overflow:hidden; 3、 FeatureInternetExplorer8InternetExplorer9 border-radius  不支持  支持 box-shadow  不支持  支持 transform  不支持  支持,with -ms p

  • 2019-助教总结

        2018年做助教的时候,由于本身发生较多,所以有些时候助教的任务不得不推延,但是还是保持一定质量的完成。在此期间热情不断的下降,虽然不至于影响作业的评分,但是总感觉不是很对,只主要的原因是:     1.自身事情多,没有太多的时间投入助教的工作;     2.作业的重复性和质量差距较大,导致评分的时候没有太多的悬念;     3.同一时间,我觉得软工的工作量和我的一对比,觉得太简单了,所以没有太多的兴趣细看下去。     4.自身也越来越社会化,学校的教育有点“太软”和太松的感觉;在弱肉强食的社会,不适合就得被淘汰。    做助教兼上班的感悟(可能我不适合当助教吧):    1.刚开始的热情很快就被会取代,因为觉得付出得到的回报太少(相对于社会的成长值太少了)。    2.从作业上我感觉不到他

  • Java 验证需要处理的文件是否已经传输完成

    问题描述   目前在工作过程中遇到一个问题,批处理需要定时检测目标目录下面是否有文件,如果有文件,需要导入文件内容,并且把文件移动到历史目录。   健壮性考虑   发现目标文件夹有文件后,需要先做一步校验,验证目标文件是否是完整文件,即上游文件内容是否已经传输完成。 校验方法   写一个while循环,获取文件的MD5内容,sleep2s后再获取文件的MD5内容,如果2次的MD5值是一样的,说明目标文件是最终文件,可以继续下面的文件内容导入的工作。 DigestUtils.md5Hex(FileInputStreamfis);l复制        莫听穿林打叶声,何妨吟啸且徐行!!!

  • 1.3 可编程渲染管线

    目录 从固定到可编程 探秘GPU渲染管线 着色器编程 实验导学 实验 从固定到可编程 图形编程的发展 早期图形编程: 与具体硬件有关,不可移植;用来绘制图元及其属性的函数库低级;程序员虽然拥有很大的控制权,但耗费时间 图形标准的产生: 硬件供货商提供标准图形函数库;GKS、PHIGS、OPENGL;设备无关 固定管线 图形API提供了一个对硬件操作的标准接口;API对程序员提出的各种绘制图元或属性的请求都采用固定的方式来处理;这种内部实现方式被称为“固定功能渲染流水线”;程序员控制权减少,更方便 固定到可编程: 勾函数hooks的出现:突破固定功能流水线的限制,使用可编程着色器修改流水线中某些特定步骤的行为。       GPU渲染管线 渲染管线的功能:决定在给定虚拟相机、三维物体、光源、照明模式,以及纹理等诸多条件的情况下生成或绘制一幅二维图像的过程。     GPU渲染管线的三个概念阶段 应用阶段--->几何阶段--->光栅化阶段           &nb

  • Android M以上运行时权限(Google官方出品)

    转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6690152.html    网上运行时权限的例子、Demo无计其数,但是和Google官方出品的比起来,都显得很啰嗦。作为Android开发人员应该以Google的实例为样本。官方出品,必属精品!!! Google官方RuntimePermissionsDemo地址:https://github.com/googlesamples/android-RuntimePermissions   Demo如下(这里强调一下,Google推荐使用Snackbar代替Toast) 在AndroidM版本(即6.0以后的版本),多了一个特殊权限处理。开发者的开发工具AndroidStudio如果是AndroidAPI23Platform或以上版本,需要在调用特殊权限的地方手动将权限打开,在AndroidManifest直接说明是不好用的。 那么都有哪些权限是需要特殊处理的呢。下面我就把这些特殊权限按类罗列出来,并告诉你如何在代码中进行手动调用。 需要单独申请的权限共分为9组,

  • css 文本两行显示,超出省略号表示

     重点:text-overflow:ellipsis;只对display:inline;起作用 复制 例子: <spanclass="a">我说说<bclass="b">打瞌睡党风建设打火机</b>说说色儿</span> 复制 a{   display:block/inline-block; width:100px;   overflow:hidden; white-space:nowrap;  text-overflow:ellipsis; } b{   display:inline;//正确   display:inline-block//错误,b标签里的字超出不能显示省略号(...) }    //一行   white-space:nowrap;    text-overflow:ellipsis;    o

  • Centos 执行top命令详细解读

    1.作用:top命令用来显示执行中的程序进程,使用权限是所有用户。   2.格式:top[-][ddelay][q][c][S][s][i][n]   3.主要参数: d:指定更新的间隔,以秒计算。 q:没有任何延迟的更新。如果使用者有超级用户,则top命令将会以最高的优先序执行。 c:显示进程完整的路径与名称。 S:累积模式,会将己完成或消失的子行程的CPU时间累积起来。 s:安全模式。 i:不显示任何闲置(Idle)或无用(Zombie)的行程。 n:显示更新的次数,完成后将会退出top。   4.说明:top命令是Linux系统管理的一个主要命令,通过它可以获得许多信息。这里我们结合图1来说明它给出的信息。   top命令的显示(图略)   第一行表示的项目依次为当前时间、系统运行时间、当前系统登录用户数目、1/5/10分钟系统平均负载(一般来说,这个负载值应该不太可能超过1才对,除非您的系统很忙碌。如果持续高于5的话,那么.....仔细的看看到底是那个程序在影响整体系统吧!)。   第二行显示的是所有启动的进程、目前运

相关推荐

推荐阅读