📜  py-4 (1)

📅  最后修改于: 2023-12-03 15:03:54.059000             🧑  作者: Mango

PY-4

简介

PY-4是一个Python编程语言的高级特性主题,它包括了Python中的元类、装饰器、上下文管理器、迭代器、生成器等,这些特性可以帮助程序员快速开发高效的Python应用程序。

元类

在Python中,一切皆对象,包括类,所以类也是一个对象,而元类就是用于创建这个类对象的“模板”。元类可以控制类对象的创建过程,通常用于实现API或者框架。

示例
class Singleton(type):
    _instances = {}

    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super().__call__(*args, **kwargs)
        return cls._instances[cls]

class MyClass(metaclass=Singleton):
    pass

a = MyClass()
b = MyClass()

assert a is b

上面的代码演示了使用元类创建一个单例模式,只有在第一次实例化类的时候,Singleton才会生成一个新的对象,接下来每次实例化都会返回同一个对象。

装饰器

Decorator(装饰器)是一种Python函数,它可以在不改变函数代码的前提下增强函数的功能。装饰器为已经存在的对象添加额外的功能,常用于有切面需求的场景如:插入日志、性能测试、事务处理等。

示例
def memoize(func):
    caches = {}
    def wrapper(*args):
        if args in caches:
            return caches[args]
        result = func(*args)
        caches[args] = result
        return result
    return wrapper

@memoize
def fibonacci(n):
    if n<=1:
        return n
    return fibonacci(n-1)+fibonacci(n-2)

上面的代码演示了装饰器的使用,fibonacci函数的计算过程被优化为了使用缓存,计算相同的n时,不需要重新计算,而是可以从缓存中快速获取结果。

上下文管理器

上下文管理器用于控制一个代码块的进入和退出,并且能够定义在这个代码块执行前后需要完成的操作。上下文管理器可以用于文件系统操作、线程锁,甚至是做数据库事务。

示例
class File:
    def __init__(self, file_path, mode):
        self.file_path = file_path
        self.mode = mode

    def __enter__(self):
        self.file = open(self.file_path, self.mode)
        return self.file

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file.close()

with File('file.txt', 'w') as file:
    file.write('Hello, world!')

上面的代码演示了在File类中实现上下文管理器,当程序进入with语句块时,文件对象被打开,并可以作为上下文管理器返回,当程序离开with语句块时,文件被自动关闭。

迭代器

在Python中,迭代器是一个让你可以顺序访问容器的对象。容器是任何具有 iter () 方法的对象(list,tuple,dictionary 等)。迭代器是用于访问这些容器元素的一种方式,而不必暴露底层细节。

示例
class Fibonacci:
    def __init__(self):
        self.a = 0
        self.b = 1

    def __iter__(self):
        return self

    def __next__(self):
        result = self.a
        self.a, self.b = self.b, self.a + self.b
        return result

fibonacci = Fibonacci()
for i in fibonacci:
    if i > 100:
        break
    print(i)

上面的代码演示了自定义Fibonacci类,实现__iter__和__next__方法,使得该类对象成为可迭代的。for循环可以遍历Fibonacci对象,打印出小于100的数列。

生成器

生成器是Python的一个特殊的函数,它以惰性方式生成值。与列表等容器类型不同,生成器并不事先生成完所有项目,而是在需要时逐个生成。这使得它们能够处理大量数据或无限数列等。

示例
def fibonacci(n):
    a, b = 0, 1
    while n > 0:
        yield a
        a, b = b, a + b
        n -= 1

for i in fibonacci(10):
    print(i)

上面的代码演示了如何生成斐波那契数列,通过使用yield关键字定义了一个生成器函数,而不是一个普通的函数。循环遍历这个生成器函数,并打印生成的斐波那契数列。