今天遇到的新单词: enterprise n企业 ********************************** 魔法方法; 魔法方法:已经具备了一定功能的固有的方法! (1)常见魔法方法 输出 __str__(): 输出当前对象 在内存中的地址 十六进制表示字符串! __repr__(): 用于在交互模式下,直接操作变量时~获取变量数据的定义!
比较大小中会用到的魔法方法: __gt__():grant than大于 __lt__(): less than小于 __ge__(): grant or equals大于或者等于 __le__(): less or equals小于或者等于 __ne__(): not equals 不等于 __eq__(): equals 等于
算数运算中会用到的魔法方法: __add__():加法 __sub__():减法 __mul__():乘法 __truediv__():除法 __floordiv__():整除
这些魔法方法可以直接重写,重写成自己想要的结果,从而达到直接操作对象名进行运算和比较大小的目的。 实例如下: class Student: def __init__(self, name, age): self.name = name self.age = age def __gt__(self, other): if isinstance(other, Student): if self.age >= other.age: return True else: return False else: print("ERROR:比较对象只能是Student类型")
stu1 = Student("tom", 18) stu2 = Student("jerry", 20)
print(stu1 > stu2, stu2 > stu1) print(stu1 < stu2, stu2 < stu1) 结果: False True True False
*************************** 把一个对象数据存入集合的解决方法:
set集合的特点是不能存放重复的数据,集合里面存储数据的具体步骤是先用hash算法把想要存入的数据进行 hash运算,算出来一个整数,然后用eq进行比较,如果比较的结果相等的则表示有重复的数据就不能存储成功。 如果想把对象的数据存进集合中,还要满足存储的账号不能重复,这时就需要对象中的两个内置的魔法方法进行 重写:分别是__hash__ ,和__eq__,具体代码如下: def _ _hash_ _(self): return self.name._ _hash_ _()
def _ _eq_ _(self, other): if self.name == other.name: return True else: return False 这两个魔法方法一般要写都是一起写的!
********************************** 重写__str__和__repr__魔法方法的区别: 重写__repr__方法后,不管直接输出对象名还是通过print 对象名打印的信息都按我们__repr__方法 中定义的内容进行显示 而重写__str__后你会发现,直接输出对象名时并没有按我们__str__方法中定义的内容进行输出,只有通过 print 对象名后输出的信息才是按照__str__中定义的内容显示的 当我们想所有环境下都统一显示的话,可以重构__repr__方法;当我们想在不同环境下支持不同的显示, 例如终端用户显示使用__str__,而程序员在开发期间则使用底层的__repr__来显示,
********************************** 列表剔除重复的数据可以用集合作为一个桥梁,例如: a = {1,2,2,3,4,5,6,6,6} b = set(a) a =list(b) 这是利用了集合的特点:不能存放重复的数据,所以自动剔除了重复的数据。
***************************** 拓展名为.dll的是什么文件: DLL文件(Dynamic Linkable Library 即动态链接库文件),在Windows中,许多应用程序并 不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于 系统中.当我们执行某一个程序时,相应的DLL文件就会被调用. 一个应用程序可有多个DLL 文件,一个DLL文件也可能被几个应用程序所共用,这样的DLL文件被称为共享DLL文件. DLL文件一般被存放在C:\Windows\System目录下,如果将所有模块的源代码都静态编译到整个 应用程序 EXE 文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的 磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费;另一个缺点是, 在编写大的 EXE 程序时,在每次修改重建时都必须调整编译所有源代码,增加了编译过程的 复杂性,也不利于阶段性的单元测试,正因为DLL 有占用内存小,好编辑等的特点有很多电脑 病毒都是DLL格式文件。但不能单独运行。 动态链接库通常都不能直接运行,也不能接收消息。 它们是一些独立的文件,其中包含能被可执行程序或其它DLL调用来完成某项 工作的函数。只有在其它模块调用动态链接库中的函数时,它才发挥作用。
拓展名是.ime的是输入法编辑器(Input Method Editor)的英文缩写,是输入法文件
vi中修改文件名的方法: 在vi中如果文件的名字打错了,可以使用mv命令重新给文件命名: mv 原文件名 修改后的文件名 mv是移动文件的命令,移动之后会自动覆盖新文件中的所有内容
*****************************
****************************** python交互模式下,变量名如果有意义的话可以直接执行显示结果,在其他工具中必须用print(变量名) 才能查看变量名代表的意义。
******************************* 面向对象中的封装: 数据封装 方法封装 属性封装:属性私有化,提供get/set方法,添加限制条件
面向对象中的继承,继承信息的查询: __base__: 查询当前类型继承的直接父类 __bases__: 查询当前类型继承的所有父类 __class__: 查看当前类型的类型数据,和对象所属的类型 __subclasses__:查看当前类型的所有子类
面向对象的多态:分为角色多态和行为多态: 角色多态:多继承体现的一个对象可以同时属于多个类型[多继承继承的多个类型]在代码运行过 程中,根据不同的使用场景,当前对象调用继承的不同类型的方法执行具体行为操作的过程! 行为多态:子类重写父类中已经存在的方法,在代码运行过程中,根据子类是否重写了父类的方法, 动态的确定执行父类/子类中的方法!
面向对象:不是一个新的技术,而是一种新的编程思想,一种由对面向过程编程思想的补充和完善而形成的一种 新的编程思想,通过对象和对象之间互相协作实现所有功能的编程思想。不要针对性的、强迫性的通过面向对 象去编程! 要根据具体的需求进行具体的分析,通过变量、函数、类型、对象的相互交互完成整体功能流程的开发, 正确的开发模式是不要依赖任何一种编程思想;没有过时的编程思想,只有对某种场景更适合的开发方法。
******************************** 面向对象中的类属性和类方法(静态方法,类方法)
之前学的是成员属性和成员方法:成员属性是声明在方法内部的属性,成员方法只能通过对象名.方法名调用
类属性:声明在类型内部,方法外部的属性称为类属性,当前的类型中所有对象都能使用 类属性的查看方式有两种: 类型名.类属性名 对象名.类属性名 通过对象名.类属性名没法修改类属性值,只是在该对象上加了一个属性 只有通过类型名.类属性名才能修改类属性的值 class Person: max_age = 120 #类属性 def __init__(self, name, age): self.name = name self.age = age
p = Person() p.max_age Person.max_age ********** 类方法: class Person: def __init__(self, name): self.name = name
@classmethod #这行代码和property的作用一样,是一个注解,注释这是什么方法并执行 def test1(cls): #类方法的第一个参数必须是类型本身cls print("类方法test1被调用") print(type(cls)) print(cls)
@staticmethod #静态方法和定义函数差不多,参数写不写都可以 def test2(): #静态方法被称作类型中的函数 print("静态方法test2被调用")
# 创建对象 p = Person("tom")
# 调用类方法:可以通过对象调用,也可以通过类型名称调用 # 如果我们的需求中~需要操作当前类型,建议使用类方法:soso few,这种情况很少 #p.test1() #Person.test1()
# 调用静态方法:通过对象可以调用,通过类型可以调用 # 任何时候,如果需求中涉及到某个类型下多个对象公共使用的方法 # 推荐定义成类型中的静态方法!-- 菜单类型中的展示菜单! p.test2() Person.test2()
************************* 异常处理 什么是异常:不正常的情况都称为异常,大致有三种情况: 语法错误:写错了!解释器解释执行时就会出错! 称为错误 运行错误:运行过程中,由于不同数据的处理出现的错误! 称为异常 运行结果错误:程序没有出错,但是运行的结果不是期望的结果! 称为BUG
错误:通过错误信息的定位,直接修改! 异常:通过处理代码,将可能出现错误的代码包含,进行选择处理:异常处理 BUG:程序中出现的一种业务漏洞,需要完善!
异常处理就要求我们在写程序的时候尽可能地把所有的情况都考虑进去,防止用户的非法输入导致程序的崩溃
异常处理一共有三种方式,分别是:(具体代码在下面) 所有异常共同处理(直接except) 指定多个异常共同处理(except后边指定多个异常,但是返回一个值) 指定多个异常分开处理(添加多个except,每个except后边跟一个异常,每个异常返回一个值)
异常处理中经常用到的4个关键字一定要弄懂他们分别执行的原理: try except else finally
try: # try里面写运行可能会出现错误的代码 choice = int(input("请输入一个整数"))
except: print("如果程序中出现错误,才会执行except中的代码")
else: print("程序try中的代码运行没有错误不会执行except中的代码会执行else中的代码")
finally: print("不论程序是否出现错误,都会执行finally中的代码")
#try不能单独使用,必须和try下面的搭配使用。
异常处理的意义就是: 当程序运行中出现要捕捉的异常时,程序会自动捕捉该异常,让程序继续向下运行,防止程序在遇到异常的时候 直接崩溃的情况!
指定要捕捉的异常名字的意义就是让我们知道程序到底出了什么错误,如果全部都用except就相当 于把所有的错误都忽略了,导致自己对自己代码里面哪里出错了出了什么错并不清楚,一旦程序的运行结果 和自己想要的结果不一致,就很难定位自己到底出了什么错误。
对于异常的处理!尽量做到精确处理! 如果你是一个有非常丰富开发经验的人,对于常规异常,可以直接excep
三种异常处理方式的具体代码实现: 1.所有异常共同处理 try: c = int(input("请输入数字:")) print(ch)
except: print("直接处理所有异常,如果没有丰富经验不推荐!")
2. 指定多个异常共同处理: #自己在项目开发时常用的开发方式,多个异常返回一个值 try: c = int(input("please enter the number:")) print(ch) except (NameError, ValueError) as e: print("明确指定1个或者多个异常进行处理")
3. 多个异常独立处理方式: #接口开发时协同开发经常用到的精确处理方式,多个异常返回多个值 try: c = int(input("sawadika:")) print(ch) except NameError as e: print("名称错误,检查是否使用了未声明变量") except ValueError as e: print("值错误,检查是否出现了非法数据")