欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

[python]类详解

最编程 2024-05-26 16:59:42
...

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

文章目录

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

PO verses OO

PO

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

OO

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

代码语言:javascript
复制
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())

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

代码语言:javascript
复制
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)

类的改造

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

代码语言:javascript
复制
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)

私有

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

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

类的模块化

在这里插入图片描述
在这里插入图片描述

静态类verses动态类

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

代码语言:javascript
复制
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

代码语言:javascript
复制
// 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

在这里插入图片描述
在这里插入图片描述