python面向对象的使用案例
python面向对象的使用案例
这篇文章给大家分享的是有关python面向对象的使用案例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
面向对象
1. 创建支持With语句的对象
我们都知道如何使用打开或关闭语句,例如打开文件或获取锁,但是如何实现自己的方法呢?
可以使用__enter__和__exit__方法实现:
classConnection:def__init__(self):...def__enter__(self):#Initializeconnection...def__exit__(self,type,value,traceback):#Closeconnection...withConnection()asc:#__enter__()executes...#conn.__exit__()executes
这是在Python中实现上下文管理的最常见方法,但是有一种更简单的方法:
fromcontextlibimportcontextmanager@contextmanagerdeftag(name):print(f"<{name}>")yieldprint(f"</{name}>")withtag("h2"):print("ThisisTitle.")
上面的代码段使用contextmanager管理器装饰器实现了内容管理协议。进入with块时,执行标记函数的第一部分(在yield之前),然后执行该块,最后执行其余的标记函数。
2. 重载运算符号的技巧
考虑到有很多比较运算符:__lt__ , __le__ , __gt__,对于一个类实现所有比较运算符可能会很烦人。这时候可以使用functools.total_ordering:
fromfunctoolsimporttotal_ordering@total_orderingclassNumber:def__init__(self,value):self.value=valuedef__lt__(self,other):returnself.value<other.valuedef__eq__(self,other):returnself.value==other.valueprint(Number(20)>Number(3))print(Number(1)<Number(5))print(Number(15)>=Number(15))print(Number(10)<=Number(2))
该代码使用total_ordering装饰器用于简化为类实现实例排序的过程。只需要定义__lt__和__eq__。
3. 在一个类中定义多个构造函数
函数重载是编程语言中非常常见的功能。即使Python不能重载正常的函数,我们也可以使用类方法重载构造函数:
importdatetimeclassDate:def__init__(self,year,month,day):self.year=yearself.month=monthself.day=day@classmethoddeftoday(cls):t=datetime.datetime.now()returncls(t.year,t.month,t.day)d=Date.today()print(f"{d.day}/{d.month}/{d.year}")
# 14/9/2019
可以不使用构造函数将所有逻辑都放入__init__并使用*args,**kwargs和一堆if语句来解决,但是比较丑陋,没有可读性和可维护性。
4. 获取对象信息
Python提供了几个函数以便我们更好的获取对象的信息,这些函数包括:type、isinstance和dir。
其中type():用于判断对象类型:
>>>type(None)<class'NoneType'>>>>type(abs)<class'builtin_function_or_method'>
对类对象type()返回的是对应class类型。下面是判断两个变量的type类型是否相同:
>>>type(11)==type(22)True>>>type('abc')==strTrue>>>type('abc')==type(33)False
isinstance():可以显示对象是否是某种类型
>>>classHusty(Dog):...pass...>>>a=Animal()>>>b=Dog()>>>c=Husty()>>>isinstance(c,Husty)True>>>isinstance(c,Dog)True>>>isinstance(c,Animal)True>>>isinstance(b,Husty)False
Husty是Husty、Dog、Animal类型的对象,却不能说Dog是Husty的对象。
dir():用于获取一个对象的所有方法和属性。返回值是一个包含字符串的list:
>>>dir('abc')['__add__','__class__',……'__hash__','__init__','__i……'isalnum'isidentifier','islower',……'translate','upper','zfill']
其中,类似__xx__的属性和方法都是有特殊用途的。如果调用len()函数视图获取一个对象的长度,其实在len()函数内部会自动去调用该对象的__len__()方法。
5. Iterator和切片
如果直接对Iterator切片,则会得到TypeError,指出生成器对象不可下标反问,但是有一个技巧:
importitertoolss=itertools.islice(range(50),10,20)forvalins:...
使用itertools.islice,可以创建一个islice对象,该对象是生成所需项目的迭代器。但是,这会消耗所有生成器项,直到分片开始为止,而且还会消耗islice对象中的所有项。
6. 跳过一些行
有时,必须使用已知以可变数量的不需要的行(例如注释)。也可以使用itertools:
string_from_file="""//Author:...//License:...////Date:...Actualcontent..."""importitertoolsforlineinitertools.dropwhile(lambdaline:line.startswith("//"),string_from_file.split("\n")):print(line)
该代码段仅在初始注释部分之后产生行。如果只想在迭代器的开头丢弃并且不知道其中有多少个项目,则此方法很有用。
7. 命名切片
使用大量硬编码的索引值会很容易引起代码繁琐和破坏代码可读性。常用的技巧是对索引值使用常量,除此之外我们可以使用命名切片:
示例中,可以看到可以索引,方法是先使用slice函数命名它们,然后在切出一部分字符串时使用它们。还可以使用切片对象的属性.start,.stop和.step获得更多信息。
感谢各位的阅读!关于“python面向对象的使用案例”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
推荐阅读
-
python(中无效的十进制怎么解决 python怎么转换进制)
python怎么转换进制?Python执行二进制转换:1.十进制到二进制(bin)首先,让让我们看看如何将十进制转换成二进制。我...
-
python怎么清除完全相同的行(python splte如何分隔有多个相同符号的str)
pythonsplte如何分隔有多个相同符号的str?str你的string内容str_(相同的符号)执行完了以后再在相同符号的...
-
python(编程控制电脑关机 如何控制电脑关机)
如何控制电脑关机?可以在电脑的运行窗口中输入输入公式,给电脑可以设置自动关机。1.按开快捷键winr然后打开运行窗口。2.在运行窗...
-
python中的特殊标识符(python 中 标识符中可以有逗号吗)
python中标识符中可以有逗号吗?在python语言中合法的标识符是字母、数字以及_,所以我合法的标识符中肯定不能有逗号if...
-
python(excel 提取数据写入新表 python导入excel数据找不到工作簿)
python导入excel数据找不到工作簿?我可以导入数据后找不到工作,不是因为他的工作没有被转移。什么软件可提取并合并Exce...
-
python中字典定义的四种方法(python global关键字的用法详解)
pythonglobal关键字的用法详解?global标志实际上是目的是提示python讲解器,说被其修饰的变量是全局变量。这样...
-
python(array用法 python如何对两个数组做差处理)
python如何对两个数组做差处理?Python中的列表中的元素肯定不能真接相加,减。t最佳的位置的是将列表装换成Python中的...
-
python多行注释符号怎么表示
python多行注释符号怎么表示这篇文章主要介绍“python多行...
-
python支持的操作系统是什么
python支持的操作系统是什么这篇文章主要介绍“python支持...
-
python如何判断列表为空
python如何判断列表为空这篇文章主要介绍“python如何判断...