外国网站的浏览器,在线视频下载网站如何做,网站传送门怎么做,百度推广的定义一 装饰器的使用 (property)
property 是 Python 中用于创建属性的装饰器。它的作用是将一个类方法转换为类属性#xff0c;从而可以像 访问属性一样访问该方法#xff0c;而不需要使用函数调用的语法。使用 property 主要有以下好处#xff1a; 封装性和隐藏实现细节property)
property 是 Python 中用于创建属性的装饰器。它的作用是将一个类方法转换为类属性从而可以像 访问属性一样访问该方法而不需要使用函数调用的语法。使用 property 主要有以下好处 封装性和隐藏实现细节通过使用 property 装饰器你可以将属性的访问封装在方法内部从而隐藏了实现细节。这有助于防止用户直接访问和修改类的内部状态提高了类的封装性。 属性访问的一致性将方法转换为属性后可以使用点运算符 (.) 来访问属性与直接访问属性时的语法一致。这增强了代码的可读性和一致性。 计算属性值你 可以在 property 方法中添加逻辑来计算属性的值。这允许你根据需要动态生成属性而不必存储额外的数据。 属性验证和保护property 方法允许你在 设置属性值之前进行验证和保护。你可以在 property 的 setter 方法中添加验证逻辑确保属性值符合特定条件。 适用于重构如果你决定更改属性的实现方式可以在不更改类的用户代码的情况下重构 property 方法。这有助于维护代码的兼容性。
class Person:def __init__(self, gender):self.__gender gender # 私有的property # 装饰器def gender(self):return self.__gendergender.setterdef gender(self, value):if value ! boy and value ! girl:raise ValueError(Gender must be boy or girl)else:self.__gender valueif __name__ __main__:p Person(boy)print(p.gender) # boyp.gender girl # gender.setterprint(p.gender) # girlp.gender other # gender.setterprint(p.gender) # ValueError: Gender must be boy or girl
二 自定义装饰器
def logger(func): # 被装饰的函数作为方法的参数def class_time():print(二、四、六晚上上课)print(_ * 30)func()print(_ * 30)print(大概下课时间22:30)return class_time# 函数式
logger
def work():print(老师在上课)logger
def work2():print(学生不想上课)if __name__ __main__:work()print(\n)work2()
三 装饰器传参和函数传参
1 *args, **kwargs # 自定义位置参数和关键字参数
from functools import wrapsdef main_logger(time_key二、四、六晚上八点, end_time21:30):def logger(func):wraps(func)def class_time(*args, **kwargs):print(上课时间, time_key)func(*args, **kwargs)print(下课时间, end_time)return class_timereturn logger# 核心功能
main_logger()
def work():print(三月要上课啦)main_logger(time_key一、三、五晚上)
def work2():print(老子今天不上课)main_logger()
def work4(name, subject):print(f{name}在上课 {subject}课程)if __name__ __main__:# work()# work2()work4(march, dj)
四 使用对象做装饰器
class Logs:def __init__(self, start_time二、四、六晚上20:00, end_time2130):self.start_time start_timeself.end_time end_time# 重写object类中 call 方法def __call__(self, func): # func是被装饰的函数def class_time(*args, **kwargs):print(上课时间, self.start_time)func(*args, **kwargs)print(下课时间, self.end_time)return class_timeLogs() # 类对象装饰
def work(name, subject):print(f{name}在上 {subject})if __name__ __main__:work(your, 奇奇怪怪的课)
五 偏函数
functools.partial需要传入原函数和需要传入的参数
下面两种方式等价
import functools
int3 functools.partial(int, base16)
print(int3(abd))
直接写
def int2(num, base16):return int(num, base)print(int2(abd))
六 动态修改类状态
staticmethod 和 classmethod 是 Python 中用于定义静态方法和类方法的装饰器它们有不同的作用和用法。
staticmethod
静态方法是定义在类中的方法不依赖于类的实例也不依赖于类的状态。它通常用于那些不需要访问实例属性或方法的情况可以看作是类的工具函数。静态方法的第一个参数通常不是 self 或 cls而是一个普通参数用于传递方法所需要的数据。
classmethod
类方法是定义在类中的方法但它与类的实例无关而是依赖于类本身。类方法的第一个参数通常是 cls用于表示类本身可以访问类的属性和调用其他类方法。类方法通常用于工厂方法或者在创建实例之前对类进行一些操作。
6.1 定义类
class Person:def __init__(self, name, age):self.name nameself.age ageif __name__ __main__:p Person(march, 20)print(name:, p.name)print(age:, p.age)
6.2 添加属性
p.gender boy # 动态添加属性
print(gender:, p.gender)
6.3 动态添加方法
def fun():print(我是一个普通函数即将成为一个实例 方法)# 动态添加方法
p.show fun
p.show()def fun2(self):print(我也是一个普通函数第一个参数是self类成员方法的第一个参数就是self)# 第二种添加方式
p.show2 types.MethodType(fun2, p)
p.show2()
6.4 动态添加静态方法
staticmethod
def static_func():print(马上成为Person类中的静态方法, staticmethod)# 动态添加静态方法, 通过类名调用
Person.sf static_func
Person.sf()
6.5 动态添加类方法
classmethod
def class_func(cls):print(马上成为Person类中的类方法, class_method)# 动态添加类方法
Person.cf class_funcPerson.cf()# 动态添加类方法
print(dir(Person))
print(dir(p))
6.6 限制属性的添加
__slots__现在属性的添加
class Person:__slots__ (name, age)def __init__(self, name, age):self.name nameself.age ageif __name__ __main__:p Person(march, 20)p.gender boy # __slots__ (name, age) 限制可以添加的属性print(gender:, p.gender)