温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

python面向对象的使用案例

发布时间:2022-03-16 13:51:24 来源:亿速云 阅读:134 作者:小新 栏目:开发技术

这篇文章给大家分享的是有关python面向对象的使用案例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

面向对象

1. 创建支持With语句的对象

我们都知道如何使用打开或关闭语句,例如打开文件或获取锁,但是如何实现自己的方法呢?

可以使用__enter__和__exit__方法实现:

class Connection: def __init__(self): ... def __enter__(self): # Initialize connection... def __exit__(self, type, value, traceback): # Close connection... with Connection() as c: # __enter__() executes ... # conn.__exit__() executes

这是在Python中实现上下文管理的最常见方法,但是有一种更简单的方法:

from contextlib import contextmanager   @contextmanager def tag(name): print(f"<{name}>") yield print(f"</{name}>")   with tag("h2"): print("This is Title.")

上面的代码段使用contextmanager管理器装饰器实现了内容管理协议。进入with块时,执行标记函数的第一部分(在yield之前),然后执行该块,最后执行其余的标记函数。

2. 重载运算符号的技巧

考虑到有很多比较运算符:__lt__ , __le__ ,  __gt__,对于一个类实现所有比较运算符可能会很烦人。这时候可以使用functools.total_ordering:

from functools import total_ordering @total_ordering class Number: def __init__(self, value): self.value = value def __lt__(self, other): return self.value < other.value def __eq__(self, other): return self.value == other.value print(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不能重载正常的函数,我们也可以使用类方法重载构造函数:

import datetime class Date: def __init__(self, year, month, day): self.year = year self.month = month self.day = day @classmethod def today(cls): t = datetime.datetime.now() return cls(t.year, t.month, t.day) d = Date.today() print(f"{d.day}/{d.month}/{d.year}")

python面向对象的使用案例

# 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') == str True >>> type('abc') == type(33) False

isinstance():可以显示对象是否是某种类型

>>> class Husty(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__',&hellip;&hellip; '__hash__', '__init__', '__i &hellip;&hellip;'isalnum 'isidentifier', 'islower', &hellip;&hellip; 'translate', 'upper', 'zfill']

其中,类似__xx__的属性和方法都是有特殊用途的。如果调用len()函数视图获取一个对象的长度,其实在len()函数内部会自动去调用该对象的__len__()方法。

5. Iterator和切片

如果直接对Iterator切片,则会得到TypeError,指出生成器对象不可下标反问,但是有一个技巧:

import itertools s = itertools.islice(range(50), 10, 20) for val in s: ...

使用itertools.islice,可以创建一个islice对象,该对象是生成所需项目的迭代器。但是,这会消耗所有生成器项,直到分片开始为止,而且还会消耗islice对象中的所有项。

6. 跳过一些行

有时,必须使用已知以可变数量的不需要的行(例如注释)。也可以使用itertools:

string_from_file = """ // Author: ... // License: ... // // Date: ... Actual content... """  import itertools for line in itertools.dropwhile(lambda line: line.startswith("//"), string_from_file.split("\n")): print(line)

该代码段仅在初始注释部分之后产生行。如果只想在迭代器的开头丢弃并且不知道其中有多少个项目,则此方法很有用。

7. 命名切片

使用大量硬编码的索引值会很容易引起代码繁琐和破坏代码可读性。常用的技巧是对索引值使用常量,除此之外我们可以使用命名切片:

python面向对象的使用案例

示例中,可以看到可以索引,方法是先使用slice函数命名它们,然后在切出一部分字符串时使用它们。还可以使用切片对象的属性.start,.stop和.step获得更多信息。

感谢各位的阅读!关于“python面向对象的使用案例”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI