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>包含'\',则将其视为文件名;如果它命名一个目录,则为所有内容编写文档。
    

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

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

相关文章

抽象轻松的java-mybatis简单入门

第一步&#xff1a;用IDEA新建一个java包 第二步&#xff1a;在IDEA中添加数据库&#xff08;ps&#xff1a;自己百度&#xff09; 点击数据库 第二步&#xff0c;新建数据库 选择你使用的数据库 用户与密码根据自己的设置进行配置 为了更方便的查看数据库&#xff0c;可以像图…

如何提升和扩展 PostgreSQL — 从共享缓冲区到内存数据网格

利用共享缓存和操作系统缓存利用 RAM Postgres 是一个基于磁盘的数据库&#xff0c;即使您的整个架构是围绕磁盘访问设计的&#xff0c;利用 RAM 也很重要。如果按照人类规模的延迟来判断&#xff0c;这可以将延迟从几天缩短到几分钟&#xff08;图 1&#xff09;。只需看一下…

onlyoffice历史版本功能实现

一&#xff1a;开启客户端配置 如果不开启&#xff0c;回调请求里面的history和changeUrl是空 二&#xff1a;客户端主要实现2个回调函数 1.实现onRequestHistory事件&#xff0c;该事件会在ui点击查看历史的时候发起,用于展示历史列表 关键在于获取到history的内容&#xff…

Spring的事务控制

目录 基于AOP的声明事务控制 Spring事务编程概述 搭建测试环境 基于xml声明式事务控制 详解 事务增强的AOP 平台事务管理器 Spring提供的Advice&#xff08;重点介绍&#xff09; 原理 &#xff08;源码没有翻太明白&#xff09; 基于注解声明式事务控制 基于AOP的声明…

Visual Studio 2019中的安全问题

最近&#xff0c;在使用Visual Studio 2019的时候遇到了一个很奇怪的问题&#xff0c;如下所示。 这里一直在说scanf函数不安全&#xff0c;导致报错&#xff0c;然后上网查了查相关资料&#xff0c;发现在代码中加那么一句就可以了&#xff0c;而且必须放在最前面。 #define …

手机待办事项app哪个好?

手机是日常很多人随身携带的设备&#xff0c;手机除了拥有通讯功能外&#xff0c;还能帮助大家高效管理日常工作&#xff0c;借助手机上的待办事项提醒APP可以快速地帮助大家规划日常事务&#xff0c;提高工作的效率。 过去&#xff0c;我也曾经在寻找一款能够将工作任务清晰罗…

电脑技巧:推荐一款桌面增强工具AquaSnap(附下载)

下载&#xff1a;飞猫盘&#xff5c;文件加速传输工具&#xff5c;云盘&#xff5c;橘猫旗下新概念云平台&#xff0c;取件码&#xff1a;ZdRW 一、软件介绍 AquaSnap(界面增强软件)是一款功能强大的界面增强软件。这款软件支持屏幕边缘吸附与屏幕分屏即多显示器控制、摇晃窗口…

MFC扩展库BCGControlBar Pro v33.6 - 网格、报表控件功能升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v33.6已正式发布了&#xff0c;此版本包含了对图表组件的改进、带隐藏标签的单类功能区栏…

Eclipse MAT解析headp dump,total size小于file size

1. 问题描述 使用Eclipse MAT分析20GB的heap dump文件 最后解析出来dump size只有1GB 2. 原因&#xff1a;heap dump中包含许多unreachable objects Eclipse MAT的官方文档&#xff0c;《Basic Tutorial》章节&#xff0c;有对上图的Overview page做介绍 针对total size小…

unity操作_刚体 c#

刚体Rigidbody 首先在场景中创建一个Plane 位置重置一下 再创建一个Cube 充值 y0.5 我们可以看出创建的Cube 和 Plane都自带碰撞器 Plane用的是网格碰撞器 我们可以通过网格世界看到不同的网格碰撞器 发生碰撞&#xff08;条件&#xff09;&#xff1a; 两个物体都有碰撞器 …

韦东山D1S板子——xfel工具无法烧写bin文件到spi norFlash问题解决

1、早期问题排查 &#xff08;1&#xff09;参考博客&#xff1a;《韦东山D1S板子——烧录spi norFlash失败问题排查过程》&#xff1b; &#xff08;2&#xff09;早期排查到xfel工具烧写spi norFlash显示成功&#xff0c;但是实际没有烧写进bin文件&#xff0c;怀疑是norFlas…

数据统计--图形报表--ApacheEcharts技术 --苍穹外卖day10

Apache Echarts 营业额统计 重点:已完成订单金额要排除其他状态的金额 根据时间选择区间 设计vo用于后端向前端传输数据,dto用于后端接收前端发送的数据 GetMapping("/turnoverStatistics")ApiOperation("营业额统计")public Result<TurnoverReportVO…