# Pythonæºç åæç¬è®°1-Pythonå¯¹è±¡åæ¢
> 工使´ä¸¤å¹´äºï¼ç¨pythonæå¤ï¼ç¶è对äºpythonå
鍿ºå¶ä¸ä¸å®é½æ¸
æ¥ï¼æ¯å¤©æ²éäºå¢å æ¹æ¥çç®åé»è¾ç¼åï¼å®å¨èç¥ãå¾å¤ä¸è¥¿ä¸ç¨å°±å¿è®°äºï¼æ¯å¦Cè¯è¨ï¼æ£å¥½ï¼pythonæºç ç¨Cåçï¼åæpythonæºç çåæ¶åè½æ¸©æ
Cè¯è¨åºç¡ï¼å®å¨æ¯ä»¶å¾å¥½çäºæ
ãå¦å¤ï¼è¿æéå大ç¥çãpythonæºç åæãåæå¼ï¼åæä¹ä¸è³äºæ²¡å¤´æ²¡èãææå¨ä¸ä¸ªæçä¸ä½æ¶é´ï¼è½ææå°æï¼ä»¥æ¤ä¸ºè®°ã
## 1 pythonä¸ç对象
pythonä¸ï¼ä¸åä¸è¥¿é½æ¯å¯¹è±¡ï¼å¨cè¯è¨å®ç°ä¸å¯¹åºçç»æä½ãé¦å
å½ç¶è¿æ¯ä»pythonå
建对象å¼å§çèµ·ï¼æåºæ¬çæ¯PyIntObject, PyStringObject, PyListObject, PyDictObjectè¿å 个ï¼ä»ä»¬åå«å±äºintï¼string, list, dictç±»åãä»python2.2ä¹åæäºnew style classä¹åï¼è¿äºå
ç½®å¯¹è±¡é½æ¯ç»§æ¿èªobjectç±»åï¼objectå¨ä»£ç ä¸å¯¹åºPyBaseObject_Typeãæ¯å¦æä»¬èµå¼è¯å¥a=3ï¼é£ä¹aå°±æ¯ä¸ä¸ªPyIntObject对象ï¼å®çç±»åæ¯int,å¨ä»£ç ä¸å¯¹åºPyInt_Typeï¼PyInt_Type乿¯ä¸ç§å¯¹è±¡ï¼æä»¬ç§°ä¹ä¸ºç±»å对象ãé£ä¹PyInt_Typeå®çç±»åæ¯ä»ä¹å¢ï¼çæ¡æ¯typeï¼ å¯¹åºå°ä»£ç ä¸å°±æ¯PyType_Typeãå½ç¶object乿¯ä¸ä¸ªç±»å对象ï¼å®çç±»å乿¯PyType_Typeãè¿ä¹ä¸å±å±ä¸å»ï¼PyType_Type乿¯ä¸ªå¯¹è±¡ï¼é£å®çç±»å忝ä»ä¹å¢ï¼æ²¡éï¼çæ¡å°±æ¯å®çç±»åå°±æ¯å®èªå·±ï¼ãçä¸é¢çéªè¯ä»£ç ï¼
```
##å
建对象æµè¯
In [1]: a = 3
In [2]: type(a)
Out[2]: int
In [3]: type(int)
Out[3]: type
In [4]: type(type)
Out[4]: type
In [5]: int.__base__
Out[5]: object
In [6]: type(object)
Out[6]: type
```
å
åæä¸å 个åºç¡å
建对象å¨Cè¯è¨ä¸çç»æä½ä»¥å常ç¨çå 个å®ï¼ä¸ºäºæ¹ä¾¿ï¼æç¨ç乿¯éå大ç¥åæçé£ä¸ªçæ¬ä¸è´ï¼çæ¬æ¯2.5.6.æºç å®ç½æä¸è½½ã
```
// å
建对象åºç¡
#define PyObject_HEAD \
Py_ssize_t ob_refcnt; \
struct _typeobject *ob_type;
#define PyObject_HEAD_INIT(type) \
1, type,
#define PyObject_VAR_HEAD \
PyObject_HEAD \
Py_ssize_t ob_size; /* Number of items in variable part */
#define Py_INVALID_SIZE (Py_ssize_t)-1
typedef struct _object {
PyObject_HEAD
} PyObject;
typedef struct {
PyObject_VAR_HEAD
} PyVarObject;
typedef struct _typeobject {
PyObject_VAR_HEAD
const char *tp_name; /* For printing, in format "." */
Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */
destructor tp_dealloc;
printfunc tp_print;
getattrfunc tp_getattr;
setattrfunc tp_setattr;
cmpfunc tp_compare;
reprfunc tp_repr;
...
} PyTypeObject;
typedef struct {
PyObject_HEAD
long ob_ival;
} PyIntObject;
typedef struct {
PyObject_VAR_HEAD
long ob_shash;
int ob_sstate;
char ob_sval[1];
/* Invariants:
* ob_sval contains space for 'ob_size+1' elements.
* ob_sval[ob_size] == 0.
* ob_shash is the hash of the string or -1 if not computed yet.
* ob_sstate != 0 iff the string object is in stringobject.c's
* 'interned' dictionary; in this case the two references
* from 'interned' to this object are *not counted* in ob_refcnt.
*/
} PyStringObject;
```
å¦ä»£ç ä¸æç¤ºï¼**PyObjectæ¯ææPython对象çåºç³ï¼ææåç»çå°çå¯¹è±¡é½æä¸ä¸ªç¸åçPyObject头é¨,ä»èæä»¬å¯ä»¥å¨æºç ä¸çå°ææç对象é½å¯ä»¥ç¨PyObject*æéæå**ï¼è¿å°±æ¯é¢å对象ä¸ç»å¸¸ç¨å°ç夿çæå·§äºãPythonå
é¨åä¸ªå½æ°å¯¹è±¡é´ä¹æ¯éè¿PyObject*ä¼ éï¼å³ä¾¿æ¬èº«è¿æ¯ä¸ä¸ªPyIntObjectç±»åç对象ï¼ä»£ç ä¸å¹¶ä¸ä¼ç¨PyIntObject*æéè¿è¡ä¼ éï¼è¿ä¹æ¯ä¸ºäºå®ç°å¤æãæ¯å¦ä¸é¢ç彿°ï¼
```
void Print(PyObject* object) {
object->ob_type->tp_print(object);
}
```
å¦å¤å¦ä»£ç 䏿³¨éæè¯´çï¼åé¿å¯¹è±¡çob_sizeæçæ¯å
ç´ ä¸ªæ°ï¼ä¸æ¯åèæ°ç®ã
## 2 python对象å¼ç¨è®¡æ°
ä¸é¢æ¯å 个常ç¨çæä½å¯¹è±¡å¼ç¨è®¡æ°çå®å®ä¹(object.h)ï¼ä¸å¹¶ååºï¼è¿éå»é¤äºä¸äºè°è¯æ¶ç¨ç代ç ï¼æ´å®¹æçæç½ä»£ç å«ä¹ãPy_NewReferenceæ¯åå§åæ¶å¯¹è±¡æ¶è®¾ç½®å¼ç¨è®¡æ°, Py_INCREFåPy_DECREFåå«ç¨æ¥å¢å å¼ç¨ææ¯ååå°å¼ç¨è®¡æ°ãä»ä»£ç ä¸å¯ä»¥çå°ï¼pythonå¢å å¼ç¨ååå°å¼ç¨é½æ¯éè¿è¿äºå®æä½çï¼**æä¸ç¹éè¦æ³¨æçæ¯ï¼å½å¯¹è±¡å¼ç¨ob_refcntåå°å°0æ¶ï¼ä¼è°ç¨å¯¹è±¡çææå½æ°ï¼ææå½æ°å¹¶ä¸ä¸å®ä¼è°ç¨freeéæ¾å
å空é´ï¼å 为é¢ç¹ç³è¯·åéæ¾å
å严é影忧è½ï¼æä»¥å¨åé¢çå°pythonæå¤§éç¨å°å
åæ± ææ¯ï¼å¯¹æåæ§è½æå¾å¤§ææã
**éè¦è¯´æçæ¯ï¼ç±»å对象æ¯ä¸å¨å¼ç¨è®¡æ°è§åä¹ä¸çï¼æ¯ä¸ªå¯¹è±¡æåç±»å对象çæéå¹¶ä¸è§ä¸ºç±»å对象çå¼ç¨ï¼ä¹å°±æ¯è¯´ä¸ä¼å½±åç±»å对象çå¼ç¨è®¡æ°ï¼ç±»å对象永è¿ä¸ä¼è¢«ææã**
```
#define _Py_NewReference(op) ((op)->ob_refcnt = 1)
#define _Py_Dealloc(op) (*(op)->ob_type->tp_dealloc)((PyObject *)(op)))
#define Py_INCREF(op) ((op)->ob_refcnt++)
#define Py_DECREF(op) \
if (--(op)->ob_refcnt != 0) \
;
else \
_Py_Dealloc((PyObject *)(op))
#define Py_CLEAR(op) \
do { \
if (op) { \
PyObject *tmp = (PyObject *)(op); \
(op) = NULL; \
Py_DECREF(tmp); \
} \
} while (0)
/* Macros to use in case the object pointer may be NULL: */
#define Py_XINCREF(op) if ((op) == NULL) ; else Py_INCREF(op)
#define Py_XDECREF(op) if ((op) == NULL) ; else Py_DECREF(op)
```
## 3 Python对象åç±»
pythonä¸ç对象大è´å¯ä»¥å为ä¸é¢å ç±»ï¼
- æ°å¼å¯¹è±¡ï¼å¦integer,float,boolean
- åºåéå对象ï¼å¦string,list,tuple
- åå
¸å¯¹è±¡ï¼å¦dict
- ç±»å对象ï¼å¦type
- å
é¨å¯¹è±¡ï¼å¦åé¢ä¼çå°çcodeï¼functionï¼frameï¼module以åmethod对象çã
## 4 åèèµæ
- ãpythonæºç åæã