台州市建设监理协会网站数码类网站名称

当前位置: 首页 > news >正文

台州市建设监理协会网站,数码类网站名称,简阳电力建设立项网站,建筑工程考试题库目录1.staticmethod2.classmethod3、classmethod 与staticmethod比较4. property5.abstractmethod6.wraps7.lru_cache8.timeout9.retrystaticmethod#xff1a;将一个方法转换为静态方法#xff0c;可以在不创建类实例的情况下调用。classmethod#xff1a;将一个方法转换为… 目录1.staticmethod2.classmethod3、classmethod 与staticmethod比较4. property5.abstractmethod6.wraps7.lru_cache8.timeout9.retry staticmethod将一个方法转换为静态方法可以在不创建类实例的情况下调用。classmethod将一个方法转换为类方法可以在不创建类实例的情况下调用并且可以访问类的属性和方法。property将一个方法转换为属性可以像访问属性一样访问方法而不需要使用括号调用。abstractmethod定义一个抽象方法子类必须实现该方法才能被实例化。wraps将一个函数的元信息如函数名、文档字符串、参数列表等复制到另一个函数中可以避免装饰器对函数元信息的影响。lru_cache使用 LRU 算法实现的缓存装饰器可以缓存函数的计算结果避免重复计算。timeout设置函数的最大执行时间如果函数执行时间超过设定的时间就会抛出 TimeoutError 异常。retry在函数执行失败时自动重试可以设置重试次数、重试间隔等参数。 这些装饰器都是 Python 中常用的装饰器可以帮助我们简化代码、提高效率、增强程序的可读性和可维护性。 1.staticmethod class MyClass:staticmethoddef my_static_method(x, y):return x y# 不需要创建类实例直接调用静态方法 result MyClass.my_static_method(1, 2) print(result) # 输出 32.classmethod class MyClass:class_var 0classmethoddef my_class_method(cls, x):cls.class_var xreturn cls.class_var# 不需要创建类实例直接调用类方法 result1 MyClass.my_class_method(1) result2 MyClass.my_class_method(2) print(result1, result2) # 输出 1 33、classmethod 与staticmethod比较 classmethod 和 staticmethod 都是 Python 中的装饰器用于定义类方法和静态方法。虽然它们都可以在类中定义方法通过类名直接调用而不需要创建类的实例但是它们有一些不同之处。 不同点 classmethod 的第一个参数是类本身通常命名为 cls而 staticmethod 没有特殊的参数。classmethod 可以访问和修改类的属性和方法而 staticmethod 只能访问类的属性和方法不能修改它们。classmethod 可以被子类继承和重写而 staticmethod 不会被继承和重写。 以下是一个简单的示例代码演示了如何使用 classmethod 和 staticmethod class MyClass:class_variable 0def init(self, instance_variable):self.instance_variable instance_variableclassmethoddef class_method(cls):cls.class_variable 1print(Class variable:, cls.class_variable)staticmethoddef static_method():print(Static method)# 调用类方法 MyClass.class_method() # 输出 Class variable: 1# 创建类实例 obj MyClass(10)# 调用静态方法 obj.static_method() # 输出 Static method# 调用类方法 obj.class_method() # 输出 Class variable: 24. property 将一个方法转换为属性可以像访问属性一样访问方法而不需要使用括号调用。 我们使用 property 装饰器定义了一个 getter 方法 x用于获取私有属性 _x 的值。我们使用 x.setter 装饰器定义了一个 setter 方法 x用于设置私有属性 _x 的值。 class MyClass:def init(self, x):self._x xpropertydef x(self):return self._xx.setterdef x(self, value):self._x value# 访问属性 x实际上调用的是方法 x() obj MyClass(1) print(obj.x) # 输出 1# 修改属性 x实际上调用的是方法 x(value) obj.x 2 print(obj.x) # 输出 25.abstractmethod abstractmethod 是 Python 中的一个装饰器用于定义抽象方法。抽象方法是一种没有实现的方法它只是一个接口需要在子类中实现。抽象方法通常用于定义一个类的接口而不是具体的实现。 使用 abstractmethod 装饰器可以让我们在抽象类中定义抽象方法强制要求子类实现这些方法。如果子类没有实现抽象方法那么在实例化子类时会抛出 TypeError 异常。 以下是一个简单的示例代码演示了如何使用 abstractmethod 装饰器定义抽象方法 from abc import ABC, abstractmethodclass Shape(ABC):abstractmethoddef area(self):passclass Rectangle(Shape):def init(self, width, height):self.width widthself.height heightdef area(self):return self.width * self.heightclass Circle(Shape):def init(self, radius):self.radius radiusdef area(self):return 3.14 * self.radius ** 2# 创建 Rectangle 和 Circle 对象并调用 area() 方法 rect Rectangle(10, 20) print(Rectangle area:, rect.area())circle Circle(5) print(Circle area:, circle.area())# 创建 Shape 对象会抛出 TypeError 异常 shape Shape()

TypeError: Cant instantiate abstract class Shape with abstract methods area6.wraps

wraps 是 Python 中的一个装饰器用于修饰其他装饰器它可以帮助我们保留被修饰函数的元信息例如函数名、文档字符串、参数列表等。如果我们不使用 wraps 装饰器那么被修饰函数的元信息可能会丢失或被修改导致代码可读性和可维护性下降。 使用 wraps 装饰器的主要用途是在编写装饰器时保留被修饰函数的元信息。例如如果我们编写一个装饰器用于记录函数的执行时间那么使用 wraps 装饰器可以保留被修饰函数的函数名、文档字符串、参数列表等信息使得调试和维护代码更加方便。 以下是一个简单的示例代码演示了如何使用 wraps 装饰器保留被修饰函数的元信息 from functools import wraps import timedef timer(func):wraps(func)def wrapper(*args, **kwargs):start_time time.time()result func(*args, **kwargs)end_time time.time()print(f{func.name} took {end_time - start_time:.2f} seconds)return resultreturn wrappertimer def my_func():This is a docstringprint(Hello, world!)my_func() print(Function name:, my_func.name) print(Docstring:, my_func.doc)

(env) [hanhandiVM-33-162-centos ~/hanhan_PythonScripts/装饰器使用]$ python other.py

Hello, world!

my_func took 0.00 seconds

Function name: my_func

Docstring: This is a docstring

在上面的代码中我们定义了一个名为 timer 的装饰器用于记录函数的执行时间。我们使用 wraps 装饰器修饰了内部的 wrapper 函数保留了被修饰函数的元信息。然后我们定义了一个名为 my_func 的函数并使用 timer 装饰器修饰它。最后我们调用了 my_func() 函数并输出了它的执行时间、函数名和文档字符串。 使用 wraps 装饰器可以让我们编写更加健壮和可维护的装饰器同时也可以提高代码的可读性和可维护性。 7.lru_cache 这个之前有讲解过不过之前用的是cachetools https://blog.csdn.net/qq_42604176/article/details/130045268?spm1001.2014.3001.5501 from functools import lru_cachelru_cache(maxsize128) def fibonacci(n):if n 2:return nreturn fibonacci(n-1) fibonacci(n-2)# 缓存函数的计算结果避免重复计算 result fibonacci(10) print(result) # 输出 558.timeout timeout 是 Python 中的一个装饰器用于设置函数的最大执行时间。如果函数在规定的时间内没有执行完毕那么装饰器会抛出 TimeoutError 异常中断函数的执行。 使用 timeout 装饰器的主要用途是在编写需要限制执行时间的函数时保证函数不会一直执行下去避免出现死循环或长时间阻塞的情况。例如如果我们编写一个函数用于从远程服务器下载文件那么使用 timeout 装饰器可以设置最大下载时间避免下载过程中出现网络故障或服务器故障导致程序一直阻塞。 以下是一个简单的示例代码演示了如何使用 timeout 装饰器设置函数的最大执行时间 import signalclass TimeoutError(Exception):passdef timeout(seconds):def decorator(func):def handler(signum, frame):raise TimeoutError(Function timed out)def wrapper(*args, **kwargs):signal.signal(signal.SIGALRM, handler)signal.alarm(seconds)result func(*args, **kwargs)signal.alarm(0)return resultreturn wrapperreturn decoratortimeout(5) def my_func():import timetime.sleep(10)print(Function finished)try:my_func() except TimeoutError as e:print(Function timed out:, e)在上面的代码中我们定义了一个名为 timeout 的装饰器用于设置函数的最大执行时间。我们首先定义了一个名为 TimeoutError 的异常类用于在函数超时时抛出异常。然后我们定义了一个名为 decorator 的装饰器函数它接受一个函数作为参数并返回一个新的函数 wrapper。在 wrapper 函数中我们使用 signal 模块设置了一个定时器当函数执行时间超过规定的时间时会抛出 TimeoutError 异常。最后我们使用 timeout(5) 装饰器修饰了 my_func 函数设置了最大执行时间为 5 秒。在调用 my_func() 函数时如果函数执行时间超过 5 秒会抛出 TimeoutError 异常。 使用 timeout 装饰器可以让我们编写更加健壮和可靠的函数避免出现死循环或长时间阻塞的情况。同时它也可以提高代码的可读性和可维护性。 9.retry retry 是 Python 中的一个装饰器用于在函数执行失败时自动重试。如果函数执行失败装饰器会等待一段时间后再次执行函数直到函数执行成功或达到最大重试次数为止。 使用 retry 装饰器的主要用途是在编写需要重试的函数时保证函数能够在失败后自动重试避免出现因网络故障、服务器故障或其他原因导致函数执行失败的情况。例如如果我们编写一个函数用于从远程服务器下载文件那么使用 retry 装饰器可以设置最大重试次数和重试间隔时间避免下载过程中出现网络故障或服务器故障导致程序中断。 以下是一个简单的示例代码演示了如何使用 retry 装饰器设置函数的重试次数和间隔时间 import timeclass RetryError(Exception):passdef retry(max_retries, wait_time):def decorator(func):def wrapper(*args, **kwargs):for i in range(max_retries):try:result func(*args, **kwargs)return resultexcept Exception as e:print(fFunction failed: {e})if i max_retries - 1:print(fRetrying in {wait_time} seconds…)time.sleep(wait_time)raise RetryError(fFunction failed after {max_retries} retries)return wrapperreturn decoratorretry(max_retries3, wait_time2) def my_func():import randomif random.random() 0.8:raise Exception(Random error)else:print(Function succeeded)try:my_func() except RetryError as e:print(Function failed:, e)# Function failed: Random error

Retrying in 2 seconds…

Function failed: Random error

Retrying in 2 seconds…

Function failed: Random error

Function failed: Function failed after 3 retries在上面的代码中我们定义了一个名为 retry 的装饰器用于设置函数的最大重试次数和重试间隔时间。我们首先定义了一个名为 RetryError 的异常类用于在函数重试次数达到最大值时抛出异常。然后我们定义了一个名为 decorator 的装饰器函数它接受一个函数作为参数并返回一个新的函数 wrapper。在 wrapper 函数中我们使用 for 循环和 try/except 语句实现了函数的重试逻辑。如果函数执行失败会等待一段时间后再次执行函数直到函数执行成功或达到最大重试次数为止。最后我们使用 retry(max_retries3, wait_time2) 装饰器修饰了 my_func 函数设置了最大重试次数为 3 次重试间隔时间为 2 秒。在调用 my_func() 函数时如果函数执行失败会自动重试直到函数执行成功或达到最大重试次数为止。

使用 retry 装饰器可以让我们编写更加健壮和可靠的函数避免出现因网络故障、服务器故障或其他原因导致函数执行失败的情况。同时它也可以提高代码的可读性和可维护性。