【python】类的详解

news2024/11/18 3:35:56

注:最后有面试挑战,看看自己掌握了吗

文章目录

  • PO verses OO
    • PO
    • OO
    • 当一个类很复杂的时候,考虑多弄一个
  • 类的改造
  • 私有
    • 类的模块化
  • 静态类verses动态类
    • 动态类
  • 查看模块源代码
  • 对象机制的基石 PyObject

PO verses OO

PO

PO耦合性高,很多过程被重复做了。–专事专用的程序,没有未来。
重复定义相同的数据结构,非常拉跨。
自定义函数太多,记都记不住。
变量和函数联系不紧密,如果你的兄弟给你他的代码,里面有各种写好的函数,你还得拿走他的变量,防止出现一些隐藏问题。

OO

类----类名首字母大写–Box------数据+函数
方法–如__init()__—最简单的使用格式:def __init()__(self)
构造方法—特殊的方法
self关键字:在实例使用的时候,用来传输实例对象—其实是实例在内存的一个地址,隐形传递,实例可以调用的属性,必须在__init()__里面定义并且初始化

class Box:
    def __init__(self,chang,kuan,gao):
        self.chang=chang
        self.kuan=kuan
        self.gao=gao

    def say(self):
        return self.chang*self.kuan*self.gao

if '__main__' == __name__:
    a = Box(1,2,3)
    print(a.say())

当一个类很复杂的时候,考虑多弄一个

class Color1:
    def __init__(self, index=0):
        self.set_color = ["bai","hei"]
        self.index = index
    def setColor(self):
        return self.set_color[self.index]
        return self.set_color[self.index]

class Box:
    def __init__(self,chang,kuan,gao,c1=0):
        self.chang=chang
        self.kuan=kuan
        self.gao=gao
        self.color0=Color1(c1).setColor()

    def say(self):
        return self.chang*self.kuan*self.gao


if '__main__' == __name__:
    a = Box(1,2,3,1)
    print(a.say())
    print(a.color0)

类的改造

继承–不改原始代码的情况下,改造类,----假如第三方类已经被编译了,没有给源代码,也可以通过继承来改造

class Color1:
    def __init__(self, index=0):
        self.set_color = ["bai","hei"]
        self.index = index
    def setColor(self):
        return self.set_color[self.index]
        return self.set_color[self.index]

class Box:
    def __init__(self,chang,kuan,gao,c1=0):
        self.chang=chang
        self.kuan=kuan
        self.gao=gao
        self.color0=Color1(c1).setColor()

    def say(self):
        return self.chang*self.kuan*self.gao
class MyBox(Box):
    def __init__(self,chang,kuan,gao,c1):
        super().__init__(chang,kuan,gao,c1)
        self.material="paper"

    def say(self):
        return self.material

if '__main__' == __name__:
    a = MyBox(1,2,3,1)
    print(a.say())
    print(a.color0)

私有

变量函数私有化,前面加上双下划线即可

self.__color0="bai"
def __say(self)://看不到,实例无法调用此方法了
    return self.chang*self.kuan*self.gao

类的模块化

在这里插入图片描述

静态类verses动态类

静态类无法实例化 没有self关键字没有构造方法
静态类用来存一些变量和函数
使用方法

Box.say()

动态类

不要直接使用动态类里面的变量,用self属性化后使用,确保各个属性值各司其职,互不干扰

查看模块源代码

python源代码在线看
源代码
https://github.com/python/cpython/tree/3.5/Modules
在这里插入图片描述

Include 目录:包含了 Python 提供的所有头文件,如果用户需要自己用 C 或 C++来编写自定义模块扩展
Python,那么就需要用到这里提供的头文件。

Lib 目录:包含了 Python 自带的所有标准库,且都是用 Python 语言编写的。

Modules 目录:包含了所有用 C 语言编写的模块,比如 math、hashlib
等。它们都是那些对速度要求非常严格的模块。而相比而言,Lib 目录下则是存放一些对速度没有太严格要求的模块,比如 os。

Parser 目录:包含了 Python 解释器中的 Scanner 和 Parser 部分,即对 Python
源代码进行词法分析和语法分析的部分。除此以外,此目录还包含了一些有用的工具,这些工具能够根据 Python 语言的语法自动生成 Python
语言的词法和语法分析器,与 YACC 非常类似。

Objects 目录:包含了所有 Python 的内建对象,包括整数、list、dict 等。同时,该目录还包括了 Python
在运行时需要的所有的内部使用对象的实现。

Python 目录:包含了 Python 解释器中的 Compiler 和执行引擎部分,是 Python 运行的核心所在。

PCbuild 目录:包含了 Visual Studio 2003 的工程文件,研究 Python 源代码就从这里开始(本书将采用
Visual Studio 2017 对 Python 进行编译)。

Programs 目录:包含了 Python 二进制可执行文件的源码。

在这里插入图片描述

对象机制的基石 PyObject

对于初学者来说这么多类型的对象怎么学?别着急,我们后续章节会解答。

在开始我们的学习之旅之前,我们要先认识一个结构体PyObject,可以说 Python 的对象机制就是基于PyObject拓展开来的,所以我们先看看PyObject 到底长什么样。

源文件:Include/object.h

// Include/object.h
#define _PyObject_HEAD_EXTRA            \
    struct _object *_ob_next;           \
    struct _object *_ob_prev;

typedef struct _object {
    _PyObject_HEAD_EXTRA    // 双向链表 垃圾回收 需要用到
    Py_ssize_t ob_refcnt;   // 引用计数
    struct _typeobject *ob_type;    // 指向类型对象的指针,决定了对象的类型
} PyObject;

Python 中的所有对象都拥有一些相同的内容,而这些内容就定义在PyObject中,

PyObject 包含 一个用于垃圾回收的双向链表,一个引用计数变量 ob_refcnt 和 一个类型对象指针ob_type

在这里插入图片描述


🌸I could be bounded in a nutshell and count myself a king of infinite space.
 特别鸣谢:木芯工作室
特别鸣谢:木芯工作室 、Ivan from Russia


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

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

相关文章

手写Android性能监测工具,支持Fps/流量/内存/启动等

App性能如何量化:如何衡量一个APP性能好坏?直观感受就是:启动快、流畅、不闪退、耗电少等感官指标,反应到技术层面包装下就是:FPS(帧率)、界面渲染速度、Crash率、网络、CPU使用率、电量损耗速度等&#xf…

Linux命令之awk

awk是一个有强大的文本格式化能力的linux命令,早期是在Unix上实现的,linux后来也可以使用了,我们在Linux上使用的awk是gawk(GNU awk的意思) 语法 awk [option] 模式{动作} file option表示awk的可选参数,可…

mybatis与jpa

1、官方文档 mybatis:mybatis-spring – jpa:https://springdoc.cn/spring-data-jpa/ 应用文档 jpa详解_java菜鸟1的博客-CSDN博客 JPA简介及其使用详解_Tourist-xl的博客-CSDN博客_jpa的作用 2、使用比较 mybatis一般用于互联网性质的项目&#x…

zabbix4.0 Web页面配置 - 聚合图形的实现

目录 1、主机组Host groups配置 创建主机组 ​编辑 将一个主机添加至刚才创建的主机里面 2、用户参数UserParameter设置 示例: 添加一个参数:show.host.messages 模拟zabbix模板里面的参数再添加一个userparameter 3、触发器设置 示例: …

浏览器缓存之强缓存和协商缓存

为什么需要缓存? - 缓存的优点: 1.减少对服务器的访问次数,减轻了服务器的压力 2.节省用户网络带宽(就是省钱,带宽都是按流量算钱的) 3.从缓存读取更匀速减少等待优化了用户体验 - 缓存的缺点 资源被缓存后用户不能及时获取不到最新的资源,所以缓存不能乱用 强缓存 涉…

TypeScript快速上手语法+结合vue3用法

TypeScript快速上手语法结合vue3用法 前言: 本篇内容不涉及TypeScript安装以及配置,具体安装及配置篇可以看下面目录,本篇只涉及TypeScript语法相关内容,及结合vue3的用法。不讲废话,简单直接直接开撸。 目录 Type…

理想汽车--笔试(算法)

笔试分为选择题和编程题,选择题考的很全面,包括概率论、数据库、机器学习、python、数据结构。 选择题 1.在某些规划的分类器中,依据规划质量的某种度量对规划排序,保证每一个测试记录都是由覆盖它的‘最好的’规格来分类&#…

LeetCode-54. 螺旋矩阵

题目来源 54. 螺旋矩阵 题目思路 while循环只遍历"环"&#xff0c;不成环就不遍历了 四个边界 上边界 top : 0下边界 bottom : matrix.length - 1左边界 left : 0右边界 right : matrix[0].length - 1 矩阵不一定是方阵 top < bottom && left < r…

使用git从github.com中clone一个项目的源代码---git与github的安装配置与使用入门

本文目录git简介github简介git的安装github的配置1&#xff0c;注册github帐号2&#xff0c;登录github3&#xff0c;配置git4&#xff0c;生成密钥5&#xff0c;在github中添加密钥6&#xff0c;使用git从github.com中clone一个项目的源代码git简介 Git是一个开源的版本控制管…

Java知识复习(六)常见的设计模式(单例、原型、工厂)

前言 发现无论是什么设计模式&#xff0c;其实总的原则就是减少耦合&#xff0c;增加可复用代码&#xff0c;使系统更易于扩展 参考书籍&#xff1a;《秒懂设计模式》 1、单例模式&#xff08;Singleton&#xff09; 单例模式&#xff1a;即单一的实例&#xff0c;同时提供几…

【java web篇】项目管理构建工具Maven简介以及安装配置

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

【离线数仓-8-数据仓库开发DWD层-交易域相关事实表】

离线数仓-8-数据仓库开发DWD层-交易域相关事实表离线数仓-8-数据仓库开发DWD层-交易域相关事实表一、DWD层设计要点二、交易域相关事实表1.交易域加购事务事实表1.加购事务事实表 前期梳理2.加购事务事实表 DDL表设计分析3.加购事务事实表 加载数据分析1.首日全量加购的数据加载…

基于APRX并行架构的高速QPSK解调实现(Matlab仿真篇)

由于QPSK系统下变频之后的信号中频为720MHz,信息符号速率为500Mbps,因此,采用传统的串行解调方案已无法在FPGA中实现解调。因此,本方案采用基于APRX并行架构实现对高速率的QPSK解调。如图1所示,为并行全数字QPSK接收机实现架构。 图1 并行全数字QPSK接收机实现架构 1 高速…

Golang 接口笔记

基本介绍接口是一个数据类型&#xff0c;可以定义一组方法&#xff0c;但都不需要实现。并且interface中不能包含任何变量。到某个自定义类型要使用的时候&#xff0c;再根据具体情况把这些方法实现出来语法type 接口名 interface {method1(参数列表) 返回值列表method2(参数列…

UG NX二次开发(C#)-CAM-点击插件自动进入CAM模块

文章目录 1、前言2、调用CAM模块错误2、进入加工模块1、前言 UG NX软件中CAM模块作为一个很重要的,也是其特别亮点的功能模块,能实现车、铣、磨、钻等加工工艺编程,但是由于其是通用性比较强,对于专业上的可能不能完全满足要求,这就要求我们在CAM模块下进行二次开发。我们…

操作系统核心知识点整理--进程篇

操作系统核心知识点整理--进程篇什么是系统调用进程篇什么是进程什么是线程从一次fork调用看linux进程和线程的本质区别小结用户级线程和内核级线程的区别进程的状态进程的切换进程调度并发问题死锁参考本文主要面向应用层软件开发人员整理一篇必须了解的操作系统核心知识图谱&…

maya多边形顶点变形批量传递方法

一、问题描述 做项目时&#xff0c;对于重复更改相同模型的顶点位置需要大量重复操作&#xff0c;maya默认提供了多边形属性传递的方法&#xff0c;如下图&#xff1a; 但一次只能执行一次&#xff0c;并且带有大量历史节点&#xff0c;此方式的好处是&#xff0c;可以实现实…

《零成本实现Web自动化测试--基于Selenium》 Selenium-RC

一. 简介 Selenium-RC可以适应更复杂的自动化测试需求&#xff0c;而不仅仅是简单的浏览器操作和线性执行。Selenium-RC能够充分利用编程语言来构建更复杂的自动化测试案例&#xff0c;例如读写文件、查询数据库和E-mail邮寄测试报告。 当测试案例遇到selenium-IDE不支持的逻辑…

python的所有知识点+代码+注释,不看就亏死了

目录 简介 特点 搭建开发环境 版本 hello world 注释 文件类型 变量 常量 数据类型 运算符和表达式 控制语句 数组相关 函数相关 字符串相关 文件处理 对象和类&#xff0c;注&#xff1a;不是那个对象&#xff01;&#xff01;&#xff01;&#xff01;&…

HTML创意动画代码

目录1、动态气泡背景2、创意文字3、旋转立方体1、动态气泡背景 <!DOCTYPE html> <html> <head><title>Bubble Background</title><style>body {margin: 0;padding: 0;height: 100vh;background: #222;display: flex;flex-direction: colum…