Python装饰器泛化公有和私有属性

Python装饰器是一种强大的功能,允许程序员修改函数或类的行为。通过装饰器,可以在不修改函数或类本身的情况下,添加额外的功能或修改其行为。本文将深入探讨如何利用装饰器来泛化公有和私有属性的访问和修改方式。

Python装饰器的概念和作用

装饰器是Python中的一种高级功能,它允许程序员动态地改变函数或类的行为。这种机制在函数和类之外添加功能或修改功能,为代码添加灵活性和可扩展性。通过装饰器,可以在不改变原始代码的情况下,实现属性访问控制、日志记录、性能分析等操作。

泛化公有和私有属性的需求

在面向对象编程中,类的属性访问控制是一个重要的概念。有时,我们希望对公有属性和私有属性的访问行为进行监控或修改,以确保代码的安全性和可靠性。Python中的公有属性和私有属性以单下划线和双下划线开头来区分,但有时需要对这些属性的访问行为进行定制化,这就是对于泛化公有和私有属性的需求。

Python装饰器基础

Python中的装饰器是一种高级功能,能够修改函数或类的行为。让我们从一个基本的函数装饰器开始:

def my_decorator(func):def wrapper():print("在调用函数之前执行的代码")func()print("在调用函数之后执行的代码")return wrapper@my_decorator
def say_hello():print("Hello!")say_hello()

上述示例中的 my_decorator 函数是一个装饰器,say_hello 函数通过 @my_decorator 语法被修饰。运行 say_hello() 时,首先会执行 my_decorator 中定义的代码,然后才会执行 say_hello 函数中的代码。

泛化公有属性的装饰器

装饰器可以用来访问和修改类中的公有属性。以下是一个示例,展示如何创建一个装饰器来监视和修改公有属性的访问和设置:

def generalizing_public_attributes(cls):class WrappedClass(cls):def __getattribute__(self, name):print(f"访问公有属性:{name}")return super().__getattribute__(name)def __setattr__(self, name, value):print(f"设置公有属性:{name} 值为 {value}")super().__setattr__(name, value)return WrappedClass@generalizing_public_attributes
class MyClass:public_attr = 10my_instance = MyClass()
print(my_instance.public_attr)
my_instance.public_attr = 20

在这个示例中,generalizing_public_attributes 装饰器被应用在 MyClass 类上。该装饰器修改了该类的公有属性的获取和设置行为,允许在访问和修改属性时输出相应信息。

泛化私有属性的装饰器

装饰器同样可以用来访问和修改类中的私有属性。以下是一个示例:

def generalizing_private_attributes(cls):class WrappedClass(cls):def __getattribute__(self, name):print(f"访问私有属性:{name}")return super().__getattribute__(name)def __setattr__(self, name, value):print(f"设置私有属性:{name} 值为 {value}")super().__setattr__(name, value)return WrappedClass@generalizing_private_attributes
class MyClass:def __init__(self):self.__private_attr = 10my_instance = MyClass()
print(my_instance._MyClass__private_attr)
my_instance._MyClass__private_attr = 20

这个示例展示了如何使用装饰器来修改类中的私有属性。通过在属性访问和设置时输出相应信息,可以监控和修改私有属性的行为。

当谈及Python中装饰器泛化公有和私有属性时,了解如何利用装饰器来修改类的属性访问和设置行为至关重要。下面我们将进一步探讨如何利用装饰器来实现对公有和私有属性的访问控制。

操作私有属性的装饰器控制

Python中的私有属性通过双下划线(__)开头定义,这种属性在类外部默认是不可见的。通过装饰器,我们可以控制访问私有属性的行为。

def control_private_attributes(cls):class WrappedClass(cls):def __getattribute__(self, name):if name.startswith("__") and not name.endswith("__"):print(f"拒绝访问私有属性:{name}")raise AttributeError("私有属性访问被拒绝")return super().__getattribute__(name)def __setattr__(self, name, value):if name.startswith("__") and not name.endswith("__"):print(f"拒绝设置私有属性:{name}")raise AttributeError("私有属性设置被拒绝")super().__setattr__(name, value)return WrappedClass@control_private_attributes
class MyClass:def __init__(self):self.__private_attr = 10my_instance = MyClass()
print(my_instance.__private_attr)

在这个示例中,control_private_attributes 装饰器用于控制对私有属性的访问和设置行为。当尝试访问或设置私有属性时,装饰器将拒绝这样的操作,并引发 AttributeError。

装饰器的嵌套应用

有时候,我们可能需要对一个类进行多种属性行为的控制。装饰器可以嵌套使用,以实现多种控制。

def control_private_attributes(cls):class WrappedClass(cls):def __getattribute__(self, name):if name.startswith("__") and not name.endswith("__"):print(f"拒绝访问私有属性:{name}")raise AttributeError("私有属性访问被拒绝")return super().__getattribute__(name)def __setattr__(self, name, value):if name.startswith("__") and not name.endswith("__"):print(f"拒绝设置私有属性:{name}")raise AttributeError("私有属性设置被拒绝")super().__setattr__(name, value)return WrappedClassdef control_public_attributes(cls):class WrappedClass(cls):def __getattribute__(self, name):print(f"访问公有属性:{name}")return super().__getattribute__(name)def __setattr__(self, name, value):print(f"设置公有属性:{name} 值为 {value}")super().__setattr__(name, value)return WrappedClass@control_private_attributes
@control_public_attributes
class MyClass:def __init__(self):self.__private_attr = 10self.public_attr = 20my_instance = MyClass()
print(my_instance.public_attr)
print(my_instance.__private_attr)

以上示例展示了如何嵌套使用装饰器来对类的公有和私有属性进行多种控制。

总结

Python装饰器为程序员提供了灵活的工具,能够动态地修改函数或类的行为,其中包括对类中公有和私有属性的访问和设置行为进行控制。本文深入探讨了装饰器在这方面的应用。

通过基础的装饰器概念引入,了解了装饰器如何扩展函数和类的功能而不改变其本身。随后,文章重点讨论了泛化公有和私有属性的需求。对于程序员来说,控制公有和私有属性的访问行为对于代码的安全性和可维护性至关重要。

本文详细介绍了如何使用装饰器监控和修改公有属性的访问和设置行为,以及如何对私有属性的访问行为进行定制化。示例代码演示了装饰器如何拒绝或修改对类属性的访问,确保程序在访问和设置属性时更加安全和可控。

最后,通过展示装饰器的嵌套应用,强调了多重控制的灵活性。本文的目的是帮助大家理解并应用装饰器,探索其在Python类中对公有和私有属性行为控制方面的重要性。装饰器为代码提供了更多的灵活性和可扩展性,使得程序更具鲁棒性,值得进一步深入研究和应用。


如果你对Python感兴趣,想要学习python,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓
Python全套学习资料

在这里插入图片描述

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

上述所有资料 ⚡️ ,朋友们如果有需要的,可以扫描下方👇👇👇二维码免费领取🆓
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/231171.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正点原子驱动开发BUG(一)--SPI无法正常通信

目录 一、问题描述二、讲该问题的解决方案三、imx6ull的spi适配器驱动程序控制片选分析3.1 设备icm20608的驱动程序分析3.2 imx的spi适配器的驱动程序分析 四、BUG修复测试五、其他问题 一、问题描述 使用正点的im6ull开发板进行spi通信驱动开发实验的时候,主机无法…

install cuda cudnn tersorRT

# 安装 $ ubuntu-drivers devices$ sudo apt-get install nvidia-driver-470-server # 推荐是server,都可以。#delelt sudo apt --purge remove nvidia-* CUDA Toolkit Archive | NVIDIA Developerhttps://developer.nvidia.com/cuda-toolkit-archive CUDA Toolk…

在4*4的平面上计算2a1+1+1

0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 在4*4的平面上有2个点,保持2a1的结构,然后向剩余的14个格子里随机扔2个石子。 共有14*13/291种可能 1 - - - 2 - - - 3 - - 1 4 - - - 1 1 - 1 1 - - - - - - - 1 - - …

如何免费搭建私人电影网站(一)

前言:在线看电影经常会出现烦人的广告,为了不浪费时间看广告,有必要做自己的专属网站。 准备工作: 1、申请免费域名(也可以花钱注册域名相对稳定)链接: 申请免费域名方法 2、申请免费主机(也可以…

JAVA:深入探讨Java 8 Stream的强大功能与用法

1、简述 Java 8引入了Stream API,为处理集合数据提供了一种更为强大和灵活的方式。Stream是一种抽象的数据结构,它允许你以一种声明性的方式处理数据集合。与传统的集合操作不同,Stream并不是一个存储数据的数据结构,而是在源数据…

Linux线程——常用API

线程创建 函数原型及头文件 #include <pthread.h> int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);参数解读 tidp当pthread_create成功返回时&#xff0c;由tidp指向的内存单元…

接口返回HTML页面详解

import requests from bs4 import BeautifulSoup import re import jsonurl https://listado.mercadolibre.com.mx/hogar-muebles-jardin/cocina/almacenamiento-organizacion/organizadores-cocina/_CustId_570995983_PrCategId_AD# 添加 headers 和 cookies headers {User-…

深度学习网站集锦1

深度学习网站集锦 1. https://paperswithcode.com/导航栏论文和代码做了对应可以下载数据集角度看对应相关paper code看神经网络常用方法paper及实现code有什么用处还有哪些网站 1. https://paperswithcode.com/ 超简单实用&#xff0c;推荐的深度学习科研必备网站&#xff08…

第三周:Python能力复盘

资料&#xff1a; 《笨办法学Python》阅读地址&#xff1a;https://www.bookstack.cn/read/LearnPython3TheHardWay 《廖雪峰Python教程》阅读地址&#xff1a;http://t.cn/RK0qGu7 《机器学习numpy与pandas基础》&#xff1a;https://zhuanlan.zhihu.com/p/639733816 《matplo…

JAVA主流日志框架梳理学习及使用

前言&#xff1a;目前市面上有挺多JAVA的日志框架&#xff0c;比如JUL(JDK自带的日志框架),Log4j,Logback,Log4j2等&#xff0c;有人可能有疑问说还有slf4j&#xff0c;不过slf4j不是一种日志框架的具体实现&#xff0c;而是一种日志门面&#xff08;日志门面可以理解为是一种统…

Python---多任务的介绍

1. 提问 利用现学知识能够让两个函数或者方法同时执行吗? 不能&#xff0c;因为之前所写的程序都是单任务的&#xff0c;也就是说一个函数或者方法执行完成另外一个函数或者方法才能执行&#xff0c;要想实现这种操作就需要使用多任务。 多任务的最大好处是充分利用CPU资源&…

3800个字彻底弄清cortex

3800个字彻底弄清cortex arm内核发展历史cortexM0系列芯片系统框图通用寄存器m0特殊寄存器m3/m4/m7特殊寄存器 MSP和PSPxPSRPRIMASKCONTROLFAULTMASKBASEPRI 栈空间操作异常和中断 系统异常 NVIC可嵌套向量中断控制器系统操作寄存器 NVIC寄存器系统控制块SCB寄存器SysTick寄存…

如何用 Cargo 管理 Rust 工程系列 丁

以下内容为本人的学习笔记&#xff0c;如需要转载&#xff0c;请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/PP9b5cSNd-7IqgNovcrB0A 优化输出 前面已经对 cargo package 工程编译输出了好多遍&#xff0c;发现编译结果打印的信息都包含了这个 unoptimize…

黑马React:基础拓展

黑马React: D10-基础拓展 Date: December 18, 2023 useReducer 基础使用 作用: 让 React 管理多个相对关联的状态数据 补充&#xff1a;和useState的作用类似&#xff0c;用来管理相对复杂的状态数据 **特点&#xff1a;**useReducer返回值为一个数组, 可以解构处数值stat…

C++共享和保护——(4)保护共享数据

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 一滴汗珠万粒粮&#xff0c;万粒汗珠谷…

【04】GeoScene导出海图或者电子航道图000数据成果

1创建一个带有覆盖面和定义的产品 如果你没有已存在的S-57数据&#xff0c;你可以通过捕捉新的产品覆盖范围&#xff08;多边形产品范围&#xff09;及其所需的产品定义信息&#xff08;产品元数据&#xff09;来为新产品创建基础。 注&#xff1a; 如果你已经有一个S-57数据…

【NI-RIO入门】使用LabVIEW进行数据采集测量

于ni kb摘录 选择合适的编程模式 CompactRIO系统具有至少两个用户可选模式。某些CompactRIO型号具有附加的用户可选模式&#xff0c;可以在实时NI-DAQmx中进行编程。请参考本文以判断您的CompactRIO是否能够使用实时NI-DAQmx。将目标添加到项目后&#xff0c;将提示您选择要使…

wvp-GB28181-pro 2.0+ZLMediaKit 使用Dockerfile制作镜像以及部署【CentOS7】

说明 部署gb28181和zlm主要需要构建两个镜像&#xff0c;第一个为基础镜像&#xff0c;以centos7为基础构建新的基础镜像base.Dockerfile,第二个镜像为服务部署镜像server.Dockerfile&#xff0c;以第一个镜像base.Dockerfile构建出的镜像为基础镜像进行构建 整个基础镜像的构…

Python项目——表白照片墙

1、介绍 利用女神的照片&#xff0c;组成女神的名字&#xff0c;向女神表白。如下图&#xff1a; 原理&#xff1a;获取每个像素点的颜色&#xff0c;白色不贴图&#xff0c;黑色贴图。 2、工具 语言&#xff1a;python3.11编译器&#xff1a;PyCharm包&#xff1a;pygame p…

2024年【陕西省安全员C证】考试及陕西省安全员C证模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 陕西省安全员C证考试是安全生产模拟考试一点通总题库中生成的一套陕西省安全员C证模拟试题&#xff0c;安全生产模拟考试一点通上陕西省安全员C证作业手机同步练习。2024年【陕西省安全员C证】考试及陕西省安全员C证模…