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

028.Python面向对象_类补充_元类

无奋斗不青春

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈
入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈
虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈
PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈
Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈
优 质 资 源 下 载 :👉👉 资源下载合集 👈👈

分隔线

Python面向对象_类&补充_元类

    • 补充_元类
      • 概念
      • 类对象创建方式
      • 元类查找机制
      • 元类的应用场景
      • 类的描述

补充_元类

概念

  • 创建类对象的类,就是元类
  • 理解:
    • 1、对象是怎么产生的:对象是由类创建出来的
    • 2、类是不是对象:类也是对象
    • 3、类对象是不是可以由另外一个类创建出来:可以(元类)
  • 示例
    
    n = 10
    print(n.__class__)              # <class 'int'>s = 'abc'
    print(s.__class__)              # <class 'str'>class Person:passp = Person()
    print(p.__class__)              # <class '__main__.Person'>print('=' * 50)print(n.__class__.__class__)    # <class 'type'>
    print(int.__class__)            # <class 'type'>print(s.__class__.__class__)    # <class 'type'>
    print(str.__class__)            # <class 'type'>print(p.__class__.__class__)    # <class 'type'>
    print(Person.__class__)         # <class 'type'>
    
  • 图解在这里插入图片描述

类对象创建方式

  • 方式一
  • 通过 class 关键字声明
  • Python解释器扫描到这一段代码,会根据类描述自动创建类对象
  • 语法
    class ClassName:# 类对象代码块pass
    
  • 示例
    class Person:sex = '男'def eat(self, thing):print(self.name, f'用筷子吃{thing}')p = Person()
    p.name = '张三'print(p.name)           # 张三
    print(p.sex)            # 男
    p.eat('白菜')            # 张三 用筷子吃白菜
    
  • 方式二
  • 通过 type 函数手动创建
  • 语法
    var = type(name: str, bases: tuple[type, ...], dict:dict[str, Any], **kwargs)# var: 变量名,用于接收类对象
    # name:类名(字符串类型)
    # bases:父对象(元组类型)
    # dict:用键值对存放类属性和类方法(字典类型)
  • 示例
    def eat(self, thing):print(self.name, f'用筷子吃{thing}')xxx = type('Person', (), {'sex': '男', 'eat': eat})p = xxx()
    p.name = '张三'print(p.name)           # 张三
    print(p.sex)            # 男
    p.eat('白菜')            # 张三 用筷子吃白菜
    
  • 图解在这里插入图片描述

元类查找机制

  • 两种方式创建类对象,最终都是要通过元类来创建。但是并不是每一个类的创建都是通过type这个元类来创建,而是有一个元类查找机制
  • 利用元类查找机制,我们就可以通过指定类的元类来对类的创建过程进行干预
  • 元类查找机制
    • 创建一个类步骤
    • 第一步:到自己的类描述中查找是否存在__metaclass__ 属性标明元类
      • 如果有,则用标明的元类进行创建
    • 第二步:到自己继承的父类里面查找父类是否存在__metaclass__ 属性标明元类
      • 如果有,则用父类标明的元类进行创建
    • 第三步:到模块内查找是否存在__metaclass__ 属性标明元类
      • 如果有,则用模块级元类进行创建
    • 第四步:前面三种元类都没有,则会找到 type 元类进行创建
  • 示例
    # 模块级,通过__metaclass__属性指定元类 ccc
    __metaclass__ = cccclass Animal:# 父类级,通过__metaclass__属性指定元类 bbb__metaclass__ = bbbpassclass Person(Animal):# 自身级,通过__metaclass__属性指定元类 aaa__metaclass__ = aaapass
    
  • 图解在这里插入图片描述

元类的应用场景

  • 1、拦截类的创建
  • 2、修改类
  • 3、返回修改之后的类
  • 后面详细讲解

类的描述

  • 目的

    • 方便李清逻辑思路
    • 方便多人合作开发时的沟通
    • 方便生成项目文档
  • 描述方式

    • 类描述语法
      class ClassName:"""关于这个类的描述:类的作用、构造函数等;类属性的描述Attributes:count:类型,作用"""count = 1def run(self, distance, step):"""关于这个方法的作用:param distance: 类型,参数的含义,是否有默认值:param step: 类型,参数的含义,是否有默认值:return: 返回值的类型,返回结果的含义"""print("这里是run方法的代码块")return distance / step
      
    • 查看类描述
      help(ClassName)
      
    • 运行结果
      class ClassName(builtins.object)|  关于这个类的描述:类的作用、构造函数等;类属性的描述|  Attributes:|      count:类型,作用|  |  Methods defined here:|  |  run(self, distance, step)|      关于这个方法的作用|      :param distance: 类型,参数的含义,是否有默认值|      :param step: 类型,参数的含义,是否有默认值|      :return: 返回值的类型,返回结果的含义|  |  ----------------------------------------------------------------------|  Data descriptors defined here:|  |  __dict__|      dictionary for instance variables (if defined)|  |  __weakref__|      list of weak references to the object (if defined)|  |  ----------------------------------------------------------------------|  Data and other attributes defined here:|  |  count = 1
  • 生成项目文档

  • 方法1:使用内置模块(pydoc)

  • 具体步骤

    • 在cmd窗口执行命令
    查看文档描述:python3 -m pydoc 模块名称(不带.py 后缀)启动本地服务浏览文档:python3 -m pydoc -p 端口号python3 -m pydoc -b生成指定模块html文档:python3 -m pydoc -w 模块名称(不带.py 后缀)
    
  • 方法2:使用第三方模块(Sphinx、epydoc、doxygen)

    • 具体步骤在后面学习包和模块的时候进行详细讲解
  • 示例

  • 类描述代码(06-classdesc.py

    class ClassName:"""关于这个类的描述:类的作用、构造函数等;类属性的描述Attributes:count:类型,作用"""count = 1def run(self, distance, step):"""关于这个方法的作用:param distance: 类型,参数的含义,是否有默认值:param step: 类型,参数的含义,是否有默认值:return: 返回值的类型,返回结果的含义"""print("这里是run方法的代码块")return distance / step
  • 生成描述文档(只需要执行1、5即可)

    • 1、打开cmd,先切换到对应盘符,再使用 cd 目录路径 命令进入项目目录

      • 这里也可以直接鼠标右键py文件–open in – Terminal`
      • 在这里插入图片描述
    • 2、直接查看模块的描述文档 python -m pydoc 06-classdesc

      • 在这里插入图片描述
    • 3、查看模块名称中包含指定关键字的模块 python -m pydoc -k 类

      • 在这里插入图片描述
    • 4、在本地机器上的给定端口上启动HTTP服务器,用浏览器查看类描述 python -m pydoc -p 1234

      • 在任意未使用的端口上启动HTTP服务器,并打开Web浏览器以交互方式浏览文档 python -m pydoc -b

      • 在这里插入图片描述

      • 在这里插入图片描述

      • 在这里插入图片描述

      • 如果模块名称是中文,则会报错

      • 在这里插入图片描述

    • 5、将模块的HTML文档写到当前目录下的文件中 python -m pydoc -w classdesc

      • 通过指定目录名可以生成目录内所有模块的HTML文档 python -m pydoc -w 目录名\,需要将cmd的目录切换到上一级
      • 在这里插入图片描述
  • cmd命令补充

    python --help      # 查看python3命令中的帮助文档
    # 2023年10月,cmd直接输入python是执行python3,在之前是需要输入python3-b     : issue warnings about str(bytes_instance), str(bytearray_instance)and comparing bytes/bytearray with str. (-bb: issue errors)
    -B     : don't write .pyc files on import; also PYTHONDONTWRITEBYTECODE=x
    -c cmd : program passed in as string (terminates option list)
    -d     : turn on parser debugging output (for experts only, only works ondebug builds); also PYTHONDEBUG=x
    -E     : ignore PYTHON* environment variables (such as PYTHONPATH)
    -h     : print this help message and exit (also --help)
    -i     : inspect interactively after running script; forces a prompt evenif stdin does not appear to be a terminal; also PYTHONINSPECT=x
    -I     : isolate Python from the user's environment (implies -E and -s)
    -m mod : run library module as a script (terminates option list)# 以脚本形式运行库模块(终止选项列表)
    -O     : remove assert and __debug__-dependent statements; add .opt-1 before.pyc extension; also PYTHONOPTIMIZE=x
    -OO    : do -O changes and also discard docstrings; add .opt-2 before.pyc extension
    -q     : don't print version and copyright messages on interactive startup
    -s     : don't add user site directory to sys.path; also PYTHONNOUSERSITE
    -S     : don't imply 'import site' on initialization
    -u     : force the stdout and stderr streams to be unbuffered;this option has no effect on stdin; also PYTHONUNBUFFERED=x
    -v     : verbose (trace import statements); also PYTHONVERBOSE=xcan be supplied multiple times to increase verbosity
    -V     : print the Python version number and exit (also --version)when given twice, print more information about the build
    -W arg : warning control; arg is action:message:category:module:linenoalso PYTHONWARNINGS=arg
    -x     : skip first line of source, allowing use of non-Unix forms of #!cmd
    -X opt : set implementation-specific option. The following options are available:
    
  • 查看 pydoc 模块帮助文档 python -m pydoc -h

    pydoc <name> ...Show text documentation on something.  <name> may be the name of a Python keyword, topic, function, module, or package, or a dotted reference to a class or function within a module or module in a package.  If <name> contains a '\', it is used as the path to a Python source file to document. If name is 'keywords', 'topics', or 'modules', a listing of these things is displayed.        # 显示某事的文本文档。<name>可以是Python关键字、主题、函数、模块或包的名称,也可以是对模块或包中的模块中的类或函数的带点引用。如果<name>包含'\',它将被用作要记录的Python源文件的路径。如果name是'keywords', 'topics'或'modules',则显示这些内容的列表。pydoc -k <keyword>Search for a keyword in the synopsis lines of all available modules.# 在所有可用模块的概要行中搜索关键字pydoc -n <hostname>Start an HTTP server with the given hostname (default: localhost).# 使用给定的主机名(默认:localhost)启动HTTP服务器。pydoc -p <port>Start an HTTP server on the given port on the local machine.  Port number 0 can be used to get an arbitrary unused port.# 在本地机器上的给定端口上启动HTTP服务器。端口号0可用于获取任意未使用的端口。pydoc -bStart an HTTP server on an arbitrary unused port and open a Web browser to interactively browse documentation.  This option can be used in combination with -n and/or -p.# 在任意未使用的端口上启动HTTP服务器,并打开Web浏览器以交互方式浏览文档。该选项可以与-n和/或-p组合使用。pydoc -w <name> ...Write out the HTML documentation for a module to a file in the current directory.  If <name> contains a '\', it is treated as a filename; if it names a directory, documentation is written for all the contents.# 将模块的HTML文档写到当前目录下的文件中。如果<name>包含'\',则将其视为文件名;如果它命名一个目录,则为所有内容编写文档。
    

相关文章:

028.Python面向对象_类补充_元类

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…...

cocos2d-x Android原生平台与Lua交互

版本&#xff1a; cocos2d-x 语言&#xff1a; C/Java/Lua 简介 cocos2d-x原生平台Android 接入第三方SDK, 需要了解LuaJavaBridge的使用。 它封装了用于Java和Lua的相互调用, 其调用通过C为中介&#xff0c;简要的流程&#xff1a; Lua调用Java: Lua -> C -> Java J…...

17个开源的Go语言博客和CMS解决方案

Go语言&#xff0c;也称为Golang&#xff0c;是一种为构建高效、可靠和可扩展软件而设计的开源编程语言。它于2007年在Google开发&#xff0c;现在广泛用于开发Web应用程序、网络工具和系统软件。 为什么使用基于Go的CMS解决方案&#xff1f; 这些优势使Go成为开发可扩展、高…...

Jenkins 执行远程shell脚本部署jar文件问题起不来

如图&#xff1a;最开始的时候没有加&#xff1a; source /etc/profile 这一行&#xff0c; run.sh里面的java -jar xxxx.jar 一直执行不来。 一开始以为是Jenkins执行退出后会kill一切它启动的进程&#xff0c;所以加了在run.sh里面加了export BUILD_IDdontKillMe&#xff0…...

CTF网络安全题目个人导航【持续更新】

CTF-WEB导航 WEBSQLRCE反序列化文件上传SSTIXXE综合 WEB SQL [SWPUCTF 2021 新生赛]sql - 联合注入 [SWPUCTF 2021 新生赛]easy_sql - 联合注入||报错注入||sqlmap [NSSRound#1 Basic]sql_by_sql - 二次注入布尔盲注||sqlmap [NISACTF 2022]join-us - 报错注入&无列名注入…...

Matlab导入log(或txt)文件,提取数据或其他信息

导入log&#xff08;或txt)文件 先上代码&#xff1a; clc; clear; %数据导入 file1fullfile(文件路径, test1.log); % 导入文件test1.log f1fopen(file1); dt1textscan(f1,%s); %采用textscan 读取数据 %得到的dt1是元胞数组格式比如&#xff1a;有如下内容文件 导入…...

GNU和Linux的关系、 Linux的发行版本、CentOs和RedHat的区别

GNU和Linux的关系 其实&#xff0c;我们通常称之为的"Linux"系统&#xff0c;相对更准确的名称应该称为“GNU/Linux”系统&#xff01; 一个功能完全的操作系统需要许多不同的组成部分&#xff0c;其中就包括内核及其他组件&#xff1b;而在GNU/Linux系统中的内核就…...

如何在STM32中实现TCP通信?

如何在STM32中实现TCP通信&#xff1f; TCP通信在计算机网络中扮演着重要角色&#xff0c;实现它需要兼顾硬件和软件因素。 硬件层面&#xff0c;某些STM32处理器内置了Ethernet MAC&#xff0c;这有利于简化网络通信的部署。若处理器缺乏内置MAC&#xff0c;需外接以太网控制…...

Docker安装、启动、管理ElasticSearch、ElasticSearch-heade、kibana

一、ElasticSearch 1.1.镜像拉取 docker pull elasticsearch:7.17.13 1.2.启动 docker run -d --name "容器名称" -e "ES_JAVA_OPTS-Xms512m -Xmx512m" -p 9200:9200 -p 9300:9300 elasticsearch:7.17.13启动后使用docker logs查看ES启动日志&#xf…...

ACDSee Photo Studio Ultimate 2024特别版(图片编辑器)

ACDSee Photo Studio Ultimate 2024是一款功能全面、易于使用的图像编辑和管理软件&#xff0c;为摄影师和设计师提供了强大的工具和功能。无论您是进行基本的图像优化还是进行复杂的创作&#xff0c;ACDSee Photo Studio Ultimate 2024都将成为您的得力助手。 软件下载&#x…...

MySQL 3 环境搭建 MySQL 5.7版本的安装、配置

MySQL5.7.43官网下载地址 MySQL :: Download MySQL Community Server 这里选5.7.43&#xff0c;Windows版本&#xff0c;然后点击Go to Download Page&#xff0c;下载msi安装包的版本 MSI安装包版本比ZIP压缩包版本的安装过程要简单的多&#xff0c;过程更加清楚直观&#x…...

多媒体应用设计师 第2章 多媒体信息处理及编辑技术

1.多媒体信息的种类与特点 视觉类&#xff1a;文字、图像、图形、视频、动画、其他&#xff08;视频、符号表示的数值、图形表示的某种数据曲线、数据库的关系数据&#xff09; 听觉类&#xff1a;波形声音、语音、音乐 多媒体信息特点&#xff1a; 多媒体是有格式的。 越接近…...

【算法系列 | 10】深入解析查找算法之—线性查找

序言 心若有阳光&#xff0c;你便会看见这个世界有那么多美好值得期待和向往。 决定开一个算法专栏&#xff0c;希望能帮助大家很好的了解算法。主要深入解析每个算法&#xff0c;从概念到示例。 我们一起努力&#xff0c;成为更好的自己&#xff01; 今天第10讲&#xff0c;讲…...

获取操作系统信息服务器信息JVM信息cpu内存磁盘信息

1.添加依赖 <dependency><groupId>com.github.oshi</groupId><artifactId>oshi-core</artifactId><version>5.6.0</version> </dependency>...

Android笔记(四)Activity之间传递可序列化的数据的优化处理

Activity之间传递可序列化的数据 Android应用开发会常常处理数据的序列化和传递。在Android中往往采用两种方式实现数据的可序列化&#xff1a;&#xff08;1&#xff09;实现java.io.Serializable接口&#xff08;2&#xff09;实现android.os.Parcelable接口。 将类定义为an…...

MySQL MVCC详细介绍

MVCC概念 MVCC(Multi-Version Concurrency Control) 多版本并发控制&#xff0c;是一种并发控制机制,用于处理数据库中的并发读写操作&#xff0c;它通过在每个事务中创建数据的快照&#xff0c;实现了读写操作的隔离性&#xff0c;从而避免了读写冲突和数据不一致的问题。 M…...

Element Plus阻止 el-dropdown、el-switch等冒泡事件

最近做vue3项目&#xff0c;使用Element Plus,又遇到坑了&#xff01; 问题点&#xff1a;组件中遇到事件冒泡问题了&#xff0c;el-checkbox 中 change事件要求阻止冒泡&#xff0c;如下代码中要求点击checkbox时不调用li标签的show方法 <li click"show()">…...

Spring framework Day13:注解结合Java配置类

前言 前面我们管理 bean 都是在 xml 文件中去管理&#xff0c;本次我们将介绍如何在 Java 配置类中去管理 bean。 注解结合 Java 配置类是一种常见的 Spring 注入 Bean 的方式。通常情况下&#xff0c;开发人员会使用 Java Config 来定义应用程序的配置信息&#xff0c;而在 …...

彻底卸载自己安装的python

一.彻底卸载自己安装的python Python3 安装完后&#xff0c;在系统中不同目录下存在各种依赖关系&#xff0c;若需卸载&#xff0c;需要一步步无残留完全卸载干净。 删除Python 3.7 框架&#xff0c;打开终端&#xff0c;输入 sudo rm -rf /Library/Frameworks/Python.frame…...

ES相关面试问题整理

索引模板了解么 索引模板&#xff0c;一种复用机制&#xff0c;就像一些项目的开发框架如 Laravel 一样&#xff0c;省去了大量的重复&#xff0c;体力劳动。当新建一个 Elasticsearch 索引时&#xff0c;自动匹配模板&#xff0c;完成索引的基础部分搭建。 模板定义&#xf…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...