注:最后有面试挑战,看看自己掌握了吗
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