精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

詳解 Python 源碼之對象機制

移動開發
在Python中,對象就是在堆上申請的結構體,對象不能是被靜態初始化的,并且也不能是在??臻g上生存的。唯一的例外就是類型對象(type object),Python中所有的類型對象都是被靜態初始化的。

本篇文章主要是對Python 進行詳解,內容是介紹Python 源碼之對象機制,先來看內容。

1、對象

Python的世界中,一切都是對象,一個整數是一個對象,一個字符串也是一個對象,更為奇妙的是,類型也是一個對象,整數類型是一個對象,字符串類型也是一個對象。從1980年Guido在那個圣誕節揭開Python世界的大幕開始,一直到現在,Python經歷了一次一次的升級,但是其實現語言一直都是ANSI C。我們知道,C并不是一個面向對象的語言,那么在Python中,它的對象機制是如何實現的呢?

對于人的思維來說,對象是一個比較形象的概念,而對于計算機來說,對象實際上是一個抽象的概念。計算機并不能理解這是一個整數,那是一個字符串,對于計算機來說,它所知道的一切都是字節。通常的說法是,對象是數據以及基于這些數據的操作的集合。在計算機上,一個對象實際上就是一片被分配的內存空間,這些內存可能是連續的,也有可能是離散的,這都不重要,重要的是這片內存在更高的層次上可以作為一個整體來考慮,這個整體就是一個對象。在這片內存中,存儲著一系列的數據以及可以對這些數據進行修改或讀取的一系列操作的代碼。

Python中,對象就是在堆上申請的結構體,對象不能是被靜態初始化的,并且也不能是在??臻g上生存的。唯一的例外就是類型對象(type object),Python中所有的類型對象都是被靜態初始化的。

Python中,一個對象一旦被創建,它在內存中的大小就是不變的了。這就意味著那些需要容納可變長度數據的對象只能在對象內維護一個指向一個可變大小的內存區域的指針。為什么要設定這樣一條特殊的規則呢,因為遵循這樣的規則可以使通過指針維護對象的工作變得非常的簡單。因為一旦允許對象的大小可在運行期改變,我們可以考慮如下的情形。在內存中有對象A,并且其后緊跟著對象B。如果運行期某個時刻,A的大小增大了,這意味著必須將整個A移動到內存中的其他位置,否則A增大的部分將覆蓋原本屬于B的數據。一旦將A移動到內存中的其他位置,那么所有指向A的指針必須立即得到更新,光是想一想,就知道這樣的工作是多么的恐怖。

Python中,所有的東西都是對象,而所有的對象都擁有一些相同的內容,這些內容在PyObject中定義,PyObject是整個Python對象機制的核心。

  1. [object.h]   
  2. typedef struct _object {   
  3. PyObject_HEAD   
  4. } PyObject;  

實際上,PyObject是Python中不包含可變長度數據的對象的基石,而對于包含可變長度數據的對象,它的基石是PyVarObject:

  1. [object.h]   
  2. typedef struct {    PyObject_VAR_HEAD} PyVarObject; 

這兩個結構體構成了Python對象機制的核心基石,從代碼中我們可以看到,Python的對象的秘密都隱藏在PyObject_HEAD與PyObject_VAR_HEAD中。

  1. [object.h]   
  2.  
  3. #ifdef Py_TRACE_REFS  
  4. /* Define pointers to support a doubly-linked list of all live heap objects. */  
  5. #define _PyObject_HEAD_EXTRA \      
  6. struct _object *_ob_next;   \  
  7.     struct _object *_ob_prev;  
  8. #define _PyObject_EXTRA_INIT 0, 0,#else#define _PyObject_HEAD_EXTRA#define _PyObject_EXTRA_INIT#endif  
  9. /* PyObject_HEAD defines the initial segment of every PyObject. */  
  10. #define PyObject_HEAD          \      
  11. _PyObject_HEAD_EXTRA        \  
  12.     int ob_refcnt;  \      
  13. struct _typeobject *ob_type;#define PyObject_VAR_HEAD       \   
  14.    PyObject_HEAD           \      
  15. int ob_size;  
  16.  /* Number of items in variable part */ 

在PyObject_HEAD中定義了每一個Python對象都必須有的內容,這些內容將出現在每一個Python對象所占有的內存的最開始的字節中,從PyObject_VAR_HEAD的定義可以看出,即使對于擁有可變大小數據的對象,其最開始的字節也含有相同的內容,這就是說,在Python中,每一個對象都擁有相同的對象頭部。這就使得在Python中,對對象的引用變得非常的統一,我們只需要用一個PyObject *就可以引用任意的一個對象,而不論該對象實際是一個什么對象。

在PyObject_HEAD的定義中,我們注意到有一個ob_refcnt的整形變量,這個變量的作用是實現引用計數機制。對于某一個對象A,當有一個新的PyObject *引用該對象時,A的引用計數應該增加;而當這個PyObject *被刪除時,A的引用計數應該減少。當A的引用計數減少到0時,A就可以從堆上被刪除,以釋放出內存供別的對象使用。

在PyObject_HEAD中,我們注意到ob_type是一個指向_typeobject結構體的指針,那么這個結構體是一個什么東西呢?實際上這個結構體也是一個對象,它是用來指定一個對象類型的類型對象。這個類型對象我們將在后邊詳細地考察?,F在我們看到了,在Python中實際上對象機制的核心非常的簡單,一個是引用計數,一個就是類型。

而對于擁有可變長度數據的對象,這樣的對象通常都是容器,我們可以在PyObject_VAR_HEAD中看到ob_size這個變量,這個變量實際上就是指明了該對象中一共包含了多少個元素。注意,ob_size指明的是元素的個數,而不是字節的數目。比如對于Python中最常用的list,它就是一個PyVarObject對象,如果某一時刻,這個list中有5個元素,那么PyVarObject.ob_size的值就是5。

#p#

2、類型對象

在上面的描述中,我們看到了Python中所有對象的對象頭的定義。所以,當內存中存在某一個Python的對象時,該對象的開始的幾個字節的含義一定會符合我們的預期。但是,當我們把眼光沿著時間軸上溯,就會發現一個問題。當在內存中分配空間,創建對象的時候,毫無疑問地,必須要知道申請多大的空間。顯然,這不會是一個定值,因為對于不同的對象,需要不同的空間,一個整數對象和一個字符串對象所需的空間肯定不同。那么,對象所需的內存空間的大小的信息到底在哪里呢?在對象頭中顯然沒有這樣的信息。

實際上,內存空間大小這樣的對象的元信息是與對象所屬類型密切相關的,因此它一定會出現在與對象所對應的類型對象中?,F在我們可以來詳細考察一下類型對象_typeobject: 

  1. [object.h]   
  2.  
  3. typedef struct _typeobject {  
  4.     PyObject_VAR_HEAD    char *tp_name;  
  5.  /* For printing, in format "<module>.<name>" */   
  6.    int tp_basicsize, tp_itemsize;  
  7.  /* For allocation */  
  8.     /* Methods to implement standard operations */  
  9.     destructor tp_dealloc;printfunc tp_print;  
  10. ……  
  11.     /* More standard operations (here for binary compatibility) */  
  12.     hashfunc tp_hash;   
  13.    ternaryfunc tp_call;  
  14.     ……  
  15. }   
  16. PyTypeObject; 

在_typeobject的定義中包含了許多的信息,主要可以分為四類:

1、類型名,tp_name,主要是Python內部以及調試的時候使用;

2、創建該類型對象是分配內存空間的大小的信息,即tp_basicsize和tp_itemsize;

3、與該類型對象相關聯的操作信息,比如hashfunc,tp_hash就指明對于該類型的對象,如何生成其hash值。在Object.h中可以看到,hashfunc實際上是一個函數指針:typedef long (*hashfunc)(PyObject *); 在_typeobject中,包含了大量的函數指針,這些函數指針將用來指定某個類型的操作信息。這些操作主要分為標準操作(dealloc, print, compare),標準操作族(numbers, sequences, mappings),以及其他操作(hash, buffer, call…)。

4、我們在下邊將要描述的類型的類型信息。

有趣的是我們在_typeobject的頭部發現了PyObject_VAR_HEAD,這意味著類型實際上也是一個對象。我們知道在Python中,每一個對象都是對應一種類型的,那么一個有趣的問題就出現了,類型對象的類型是什么呢?這個問題聽上去很繞口,實際上確非常重要,對于其他的對象,可以通過與其關聯的類型對象確定其類型,那么通過什么來確定一個對象是類型對象呢?答案就是PyType_Type:

  1. [typeobject.c]   
  2.  
  3. PyTypeObject PyType_Type = {  
  4.     PyObject_HEAD_INIT(&PyType_Type)    0,  
  5.                   /* ob_size */    "type",  
  6.                  /* tp_name */    sizeof(PyHeapTypeObject),  
  7.        /* tp_basicsize */    sizeof(PyMemberDef),  
  8.             /* tp_itemsize */    ……    PyObject_GC_Del,  
  9.                 /* tp_free */    (inquiry)type_is_gc,  
  10.             /* tp_is_gc */}; 

前面提到,在Python中,每一個對象它的開始部分都是一樣的。每一個對象都將自己的引用計數,類型信息保存在開始的部分中。為了方便對這部分內存的初始化,Python中提供了幾個有用的宏:

  1. [object.h]#ifdef Py_TRACE_REFS#define _PyObject_EXTRA_INIT 0, 0,#else#define _PyObject_EXTRA_INIT#endif#define PyObject_HEAD_INIT(type)    \
  2.    _PyObject_EXTRA_INIT        \   
  3.    1, type, 

再回顧一下PyObject和PyVarObject的定義,初始化的動作就一目了然了。實際上,這些宏在類型對象的初始化中被大量地使用著。

如果以一個整數對象為例,可以更清晰地看到一半的類型對象和這個特立獨行的PyType_Type對象之間的關系:

  1. [intobject.c]   
  2. PyTypeObject PyInt_Type = {  
  3.     PyObject_HEAD_INIT(&PyType_Type)    0,  
  4.     "int",  
  5.     sizeof(PyIntObject),  
  6.     ……  
  7. }; 

現在我們可以放飛想象,看到一個整數對象在運行時的抽象的表示了,下圖中的箭頭表示ob_type:

詳解 Python 源碼之對象機制 

#p#

3、對象間的繼承和多態

通過PyObject和類型對象,Python利用C語言完成了C++所提供的繼承和多態的特性。前面提到,在Python中所有的內建對象(PyIntObject等)和內部使用對象(PyCodeObject等)的最開始的內存區域都擁有一個PyObject。實際上,這一點可以視為PyIntObject,PyCodeObject等對象都是從PyObject繼承而來。

在Python創建一個對象,比如PyIntObject對象時,會分配內存,進行初始化。然后這個對象會由一個PyObject*變量來維護,而不是通過一個PyIntObject*指針來維護。其它對象也與此類似,所以在Python內部各個函數之間傳遞的都是一種范型指針PyObject*。這個指針所指的對象究竟是什么類型的,不知道,只能從指針所指對象的ob_type域判斷,而正是通過這個域,Python實現了多態機制。

考慮下面的代碼:

  1. void Print(PyObject* object)   
  2. {   
  3. object->ob_type->tp_print(object);   
  4. }  

如果傳給Print的指針實際是一個PyIntObject*,那么就會調用PyIntObject對象對應的類型對象中定義的輸出操作,如果傳給Print的指針實際是一個PyStringObject*,那么就會調用PyStringObject對象對應的類型對象中定義的輸出操作。可以看到,這里同一個函數在不同情況下表現出了不同的行為,這正是多態的核心所在。

在object.c中,Python實現了一些對于類型對象中的各種操作的簡單包裝,從而為Python運行時提供了一個統一的多態接口層:

  1. [object.c]   
  2. long PyObject_Hash(PyObject *v)   
  3. {   
  4. PyTypeObject *tp = v->ob_type;   
  5. if (tp->tp_hash != NULL)   
  6. return (*tp->tp_hash)(v);   
  7.     ……   
  8. }  

4、引用計數

在C或C++中,程序員被賦予了極大的自由,可以任意地申請內存。但是權利的另一面則對應著責任,程序員必須自己負責將申請的內存釋放,并釋放無效指針??梢哉f,這一點正是萬惡之源,大量的內存泄露和懸空指針的bug由此而生,如黃河泛濫一發不可收拾 :)

現代的開發語言中一般都選擇由語言本身負責內存的管理和維護,即采用了垃圾收集機制,比如Java和C#。垃圾收集機制使開發人員從維護內存分配和清理的繁重工作中解放出來,但同時也剝奪了程序員與內存親密接觸的機會,并付出了一定的運行時效率作為代價?,F在看來,隨著垃圾收集機制的完善,對時間要求不是非常高的程序完全可以通過使用垃圾收集機制的語言來完成,這部分程序占了這個星球上大多數的程序。這樣做的好處是提高了開發效率,并降低了bug發生的機率。Python同樣也內建了垃圾收集機制,代替程序員進行繁重的內存管理工作,而引用計數正式Python垃圾收集機制的一部分。

Python通過對一個對象的引用計數的管理來維護對象在內存中的生存。我們知道在Python中每一個東西都是一個對象,都有一個ob_refcnt變量,正是這個變量維護著該對象的引用計數,從而也最終決定著該對象的生生滅滅。

在Python中,主要是通過Py_INCREF(op)和Py_DECREF(op)兩個宏來增加和減少一個對象的引用計數。當一個對象的引用計數減少到0之后,Py_DECREF將調用該對象的析構函數(deallocator function)來釋放該對象所占有的內存和系統資源。注意這里的析構函數借用了C++的詞匯,實際上這個析構動作是通過在對象對應的類型對象中定義的一個函數指針來刻畫的,還記得嗎?就是那個tp_dealloc。

如果熟悉設計模式中Observer模式,可以看到,這里隱隱約約透著Observer模式的影子。在ob_refcnt減為0之后,將觸發對象銷毀的事件;從Python的對象體系來看,各個對象又提供了不同的事件處理函數,而事件的注冊動作正是在各個對象對應的類型對象中靜態完成的。

對于這兩個宏的參數op來說,不允許op是一個指向空對象的指針(NIL),如果op是一個NIL,那么必須使用Py_XINCREF/Py_XDECREF這一對宏。

在PyObject中我們看到ob_refcnt是一個32位的整形變量,這實際是一個Python所做的假設,即對一個對象的引用不會超過一個整形變量的最大值。一般情況下,如果不是惡意代碼,這個假設顯然是不會被突破的。

需要注意的是,在Python的各種對象中,類型對象是超越引用計數規則的。類型對象“跳出三界外,不再五行中”,永遠不會被析構。每一個對象中指向類型對象的指針不被視為對類型對象的引用。

在每一個對象創建的時候,Python提供了一個_Py_NewReference(op)宏來將對象的引用計數初始化為1。

在Python的源代碼中可以看到,在不同的編譯選項下(Py_REF_DEBUG, Py_TRACE_REFS),引用計數的宏還要做許多額外的工作。下面展示的代碼是Python在最終發行時這些宏所對應的實際的代碼:

  1. [object.h]   
  2. /* Without Py_TRACE_REFS, there's little enough to do that we expand code   
  3.  * inline.   
  4.  */   
  5. #define _Py_NewReference(op) ((op)->ob_refcnt = 1)   
  6. #define _Py_Dealloc(op) ((*(op)->ob_type->tp_dealloc)((PyObject *)(op)))   
  7. #define Py_INCREF(op) ((op)->ob_refcnt++)   
  8. #define Py_DECREF(op)                   \   
  9. if (--(op)->ob_refcnt != 0)         \   
  10.         ;            \   
  11. else                        \   
  12. _Py_Dealloc((PyObject *)(op))   
  13. /* Macros to use in case the object pointer may be NULL: */   
  14. #define Py_XINCREF(op) if ((op) == NULL) ; else Py_INCREF(op)   
  15. #define Py_XDECREF(op) if ((op) == NULL) ; else Py_DECREF(op)  

在一個對象的引用計數減為0時,與該對象對應的析構函數就會被調用,但是要特別注意的是,調用析構函數并不意味著最終一定會調用free釋放內存空間,如果真是這樣的話,那頻繁地申請、釋放內存空間會使Python的執行效率大打折扣(更何況Python已經多年背負了人們對其執行效率的指責:)。一般來說,Python中大量采用了內存對象池的技術,使用這種技術避免頻繁地申請和釋放內存空間。因此在析構時,通常都是將對象占用的空間歸還到內存池中。這一點在接下來對Python內建對象的實現中可以看得一清二楚。

#p#

5、Python對象的分類

我們將Python的對象從概念上大致分為四類,需要指出的是,這種分類并不一定完全正確,不過是提供一種看待Python中對象的視角而已:

Math :數值對象

Container :容納其他對象的集合對象

Composition :表示程序結構的對象

Internal :Python解釋器在運行時內部使用的對象

圖2列出了我們的對象分類體系,并給出了每一個類別中的一些實例:

詳解 Python 源碼之對象機制

6、通向Python之路

對Python源碼的剖析將分為四部分。

1.靜態對象剖析:首先我們會分析靜態的對象,Math對象和Container對象,深刻理解這些對象對我們理解Python解釋器的運行會有很大的幫助,同時,對我們編寫Python代碼也將大有裨益,在編寫Python代碼時,你會清晰地意識到系統內部這些對象將如何運作,變化。當然,我們并不會分析所有的Python對象,而是選取使用最頻繁的四種對象:PyIntObject, PyStringObject, PyListObject, PyDictObject進行剖析。

2.運行時剖析:在分析完靜態的對象之后,我們將進入Python解釋器,在這里我們會詳細地考察Python的字節碼(byte code)以及解釋器對字節碼的解釋和執行過程。這部分將完整地展現Python中所有的語法結構,如一般表達式,控制流,異常流,函數,類等等的字節碼層面的實現細節。同時,在這部分,我們會考察大部分的Python內部對象。

3.編譯期剖析:這部分沒什么好打廣告的了,目標明確,對象清晰,但是難度呢,絕不簡單 :

4.運行環境剖析:這部分將考察從激活PythonPython準備就緒,可以接受用戶輸入或者執行腳本文件,這段時間內,Python如何建立自己的運行環境,并建立了怎樣的運行環境,呵呵透露一下,想想Python那個龐大的builtin函數集合,這些就是這部分考察的重點。

閱讀完這些內容之后,對于Python,你應該是了如指掌了,在以后編寫Python代碼時,你的腦子里甚至可以出現Python解釋器將如何一步步解釋你的代碼的情形。當然,這只是我寫作本書的副產品。這本書誕生的真正原因只有一個,興趣,我對Python的實現有濃厚的興趣。這本書也只是第一步,希望以后還能繼續對Python系列,如IronPython、Jython,PyPy的探索,當然,對于其他動態語言,比如Ruby的探索,我希望也會有時間去做。

小結:詳解 Python 源碼之對象機制的內容介紹完了,希望本文對你有幫助,更多關于Python 的內容請參考編輯推薦。

責任編輯:zhaolei 來源: CSDN博客
相關推薦

2011-06-23 13:38:27

QT 元對象 信號

2011-06-23 14:05:32

Qt 事件機制

2021-09-01 06:48:16

AndroidGlide緩存

2021-08-17 13:41:11

AndroidView事件

2021-09-03 07:27:38

AndroidGlide管理

2021-09-09 06:55:43

AndroidViewDragHel原理

2021-12-30 22:50:32

KafkaConsumer 源碼

2011-08-18 10:59:57

iPhone開發消息通信NSNotificat

2011-06-23 14:40:13

Qt 信號

2011-08-23 13:56:12

MySQLConnection

2009-07-08 13:22:30

JDK源碼分析Set

2021-09-02 07:00:01

Glide流程Android

2022-05-14 22:27:40

Nacos訂閱機制定時器

2020-05-26 18:50:46

JVMAttachJava

2023-11-27 07:44:59

RabbitMQ機制

2023-06-15 14:09:00

解析器Servlet容器

2021-09-06 13:12:05

前端JavaScript編程

2021-09-07 06:40:25

AndroidLiveData原理

2022-04-06 14:55:45

Harmony同步機制鴻蒙

2021-09-12 07:30:10

配置
點贊
收藏

51CTO技術棧公眾號

精品一区免费av| 国产三级电影在线| 九色在线免费| 99精品视频免费观看| 免费成人av在线| 亚洲精品视频免费观看| 国外成人在线视频网站| 免费视频网站在线观看入口| 99久久99久久精品国产片桃花| 日韩亚洲欧美综合| 欧美激情国产精品日韩| 日本暖暖在线视频| 99久久久无码国产精品| 国产欧美精品一区二区三区介绍| 国产一级视频在线播放| av亚洲在线观看| 欧美大胆人体bbbb| 日本久久久久久久久久久久| 超碰在线资源| 综合在线观看色| 欧美日韩电影一区二区三区| 性中国xxx极品hd| 日韩高清国产一区在线| 欧美高清在线播放| 国产传媒在线看| 国产精品一区免费在线 | 性网站在线观看| 日韩国产欧美精品| 日韩中文字幕电影| 亚洲一级在线播放| 国产伦精品一区二区三区视频| 欧美三片在线视频观看| 久久久久久久久久网| 青青青草网站免费视频在线观看| 成人在线观看亚洲| 国产白丝网站精品污在线入口| 国产97在线亚洲| 亚州国产精品视频| 欧美日韩国产成人精品| 色多多国产成人永久免费网站| 国产福利短视频| 9l视频自拍九色9l视频成人| 69堂成人精品免费视频| 特级丰满少妇一级| 丝袜美腿诱惑一区二区三区| 亚洲成av人片观看| 99在线观看视频免费| 国产鲁鲁视频在线观看特色| 国产精品人成在线观看免费| 久久亚洲一级片| 97成人精品视频在线观看| 99精品久久久久| 欧美成人激情| 中文字幕日韩在线播放| 99精品欧美一区二区| 禁断一区二区三区在线| 国产亚洲精品久久久| 国产交换配乱淫视频免费| 偷拍自拍一区| 亚洲美女av在线播放| 魔女鞋交玉足榨精调教| 亚洲人成网www| 国产视频亚洲视频| 精品人妻无码一区二区三区| 国产一区二区三区91| 亚洲欧美在线一区二区| 免费一级做a爰片久久毛片潮| 中文字幕中文字幕精品| 夜夜嗨av色一区二区不卡| 少妇一级黄色片| 97精品一区二区| 欧美大尺度在线观看| 久久久久久免费观看| 精品不卡视频| 热久久免费国产视频| 日韩黄色片网站| 中日精品一色哟哟| 成人羞羞动漫| 日韩视频在线免费| 毛片aaaaa| 99riav1国产精品视频| 欧美一区二区三区……| 黄色大全在线观看| 国产综合色在线视频区| 国产91精品入口17c| 天天色天天操天天射| 久久亚洲综合色一区二区三区| 色综合电影网| a毛片在线看免费观看| 亚洲成人在线网站| 亚洲精品高清无码视频| av在线精品| 亚洲国产成人av在线| xxxx日本黄色| 欧美xxx在线观看| 97视频色精品| 一道本在线视频| 天天av综合网| 免费在线观看日韩| 中国av免费看| 日韩欧美精品在线不卡| 国产婷婷成人久久av免费高清| 青青草综合视频| 国产丝袜视频在线播放| 亚洲国产一二三| 色综合电影网| 男女做爰猛烈刺激| 欧美电影免费播放| 91成人天堂久久成人| 影音先锋国产在线| 成人精品一区二区三区中文字幕| 91网页版在线| 国产精品久久久久久久av电影 | 苍井空张开腿实干12次| 欧美亚洲另类久久综合| 色撸撸在线观看| 1024在线播放| 91成人免费在线视频| avtt中文字幕| 欧美一区二区三区激情视频 | 亚洲最大成人网站| 欧美二区视频| 国产精品日韩欧美综合| 日本亚洲欧美| 亚洲国产色一区| 肉色超薄丝袜脚交| 精品国产乱码久久久| 久久久久久中文字幕| 一区不卡在线观看| 国产欧美一区二区精品忘忧草| 成人性生活视频免费看| 国产一区一区| 日韩一区二区三区xxxx| 国产乱国产乱老熟| 99久久久国产精品免费蜜臀| 欧美日韩午夜爽爽| 久久中文字幕一区二区| 日韩在线视频观看| 中文字幕第一页在线播放| 91麻豆高清视频| 老太脱裤子让老头玩xxxxx| 另类视频一区二区三区| 久久精品国产免费观看| 一区二区三区黄色片| 中文无字幕一区二区三区| 国产精品丝袜久久久久久消防器材 | 亚洲人被黑人高潮完整版| 男人女人黄一级| 狠狠操综合网| 欧美与欧洲交xxxx免费观看 | 日本天堂网在线观看| 免播放器亚洲一区| 欧美日韩高清在线一区| free欧美| 亚洲一区二区精品| www.亚洲激情| 国产精品蜜臀av| 不用播放器的免费av| 18禁一区二区三区| 成人国产在线| www.午夜精品| 国产成人精品a视频| 亚洲乱码中文字幕| 好吊操视频这里只有精品| 激情成人综合| 欧美不卡在线一区二区三区| 精品亚洲美女网站| 色777狠狠综合秋免鲁丝| 国产精品色综合| 一区二区三区在线视频免费| 91人妻一区二区| 国产一区成人| 亚洲国产欧美一区二区三区不卡| 91精品国产66| 久久99热精品这里久久精品| 人妻精品一区二区三区| 欧美性猛交xxxx乱大交蜜桃| 中国女人特级毛片| 国产综合色视频| 免费无码毛片一区二三区| 欧美限制电影| 97中文在线| 裤袜国产欧美精品一区| 精品激情国产视频| 三级小视频在线观看| 在线视频一区二区三| 91高清免费观看| 成人黄色在线看| 亚洲国产精品三区| 亚洲精品美女| 亚洲免费av网| 日本欧美韩国国产| 成人精品在线视频| 这里有精品可以观看| 欧美xxxx综合视频| 邻居大乳一区二区三区| 日韩女优制服丝袜电影| 中文字幕亚洲乱码熟女1区2区| 国产精品久久网站| 午夜av免费看| 国内久久婷婷综合| 久久精品香蕉视频| 一区在线视频观看| 在线观看日韩高清av| 第一区免费在线观看| 亚洲精品社区| 国产奶头好大揉着好爽视频| 鲁大师精品99久久久| 成人午夜黄色影院| 欧美黑人粗大| 欧美日韩xxxxx| eeuss影院在线播放| 亚洲第一精品夜夜躁人人躁 | 色爱综合区网| 中文字幕视频在线免费欧美日韩综合在线看 | 一区二区三区四区在线观看视频| 亚洲va天堂va欧美ⅴa在线| 在线精品视频免费播放| 日韩欧美三级在线观看| 亚洲欧美日韩国产成人精品影院 | 日韩美女视频免费看| 日韩电影免费观看| 久久久精品在线观看| 成a人v在线播放| 亚洲人成网站色ww在线| 少妇av在线播放| 日韩欧美成人午夜| 国内精品国产成人国产三级| 欧美午夜不卡在线观看免费| 可以免费看的av毛片| 亚洲成人免费av| 99热精品免费| 专区另类欧美日韩| 亚洲人成网站免费播放| 91片黄在线观看喷潮| 日本乱码高清不卡字幕| 在线观看亚洲天堂| 亚洲成av人片一区二区梦乃| 久久在线视频精品| 一区二区不卡在线播放 | 神马午夜精品95| 精品国产91久久久久久久妲己| 国产区精品在线| 欧美视频一区二区| 中文字幕日日夜夜| 欧美中文字幕一区二区三区亚洲| 欧美黑人一区二区| 狠狠色狠色综合曰曰| 天天操天天摸天天干| 精品久久久久久国产91| 日韩女优在线观看| 亚洲成人av电影在线| 91久久国产视频| 婷婷开心久久网| 欧美三级一区二区三区| 天天综合天天做天天综合| 久久精品久久精品久久| 亚洲成人你懂的| 亚洲久久在线观看| 在线一区二区视频| 一起草av在线| 欧美大片免费久久精品三p| 亚洲爆乳无码一区二区三区| 亚洲精品一区在线观看| 偷拍自拍在线| 一区二区福利视频| 韩国中文字幕在线| 欧美精品激情视频| 三妻四妾的电影电视剧在线观看| 欧日韩在线观看| 欧美网站免费| 99re视频在线播放| 林ゆな中文字幕一区二区| 欧美精品成人一区二区在线观看| 欧美日韩国产一区二区三区不卡| 永久免费精品视频网站| 精品二区久久| 人人爽人人av| 高清在线成人网| xxx在线播放| 亚洲四区在线观看| 国产手机在线视频| 欧美日韩国产影片| 黑人精品一区二区| 在线播放国产精品| 日本h片在线观看| 国产成+人+综合+亚洲欧洲| 国产精品亚洲一区二区在线观看| 国产偷国产偷亚洲高清97cao| 国产在线日韩精品| 欧美 日韩 国产精品| 久久这里只有| 久久久久久久久久久影视| 久久先锋影音av| 国产精品国产精品88| 一本色道久久综合亚洲aⅴ蜜桃| 国产一区二区在线不卡| 日韩精品久久久久久久玫瑰园| 蜜芽在线免费观看| 国内精品小视频| 亚洲国产天堂| 久久国产一区| 国内精品久久久久久久影视蜜臀| 三年中国国语在线播放免费| 成人视屏免费看| 99热这里只有精品4| 欧美性黄网官网| 国产高清第一页| 中文字幕视频在线免费欧美日韩综合在线看 | 国产精品嫩草影院在线看| 国产精品日韩三级| 六月丁香婷婷久久| 久久av无码精品人妻系列试探| 一区二区三区日韩精品视频| 欧美一级黄视频| 亚洲女人被黑人巨大进入| 黄色在线观看视频网站| 91精品国产综合久久香蕉| 国产精品嫩模av在线| 热99这里只有精品| 国产精品1024久久| 国产在线免费看| 欧洲人成人精品| 嫩草研究院在线| 国内精品久久影院| 亚洲一区二区三区日本久久九| 亚洲精品成人三区| 日日夜夜免费精品视频| 美国黄色a级片| 亚洲福利视频一区二区| 性生活视频软件| 欧美精品制服第一页| 国产精品xnxxcom| 自拍亚洲欧美老师丝袜| 免费成人小视频| 国产又粗又长又硬| 国产尤物精品| 制服丝袜综合网| 国产午夜三级一区二区三| 久久久久久少妇| 亚洲精品美女久久| 国产激情在线播放| 韩国成人av| 亚洲精品专区| 特级西西人体4444xxxx| 婷婷激情综合网| 五月天婷婷视频| 91av在线国产| 少妇精品导航| 国产a级片免费观看| 国产日韩av一区二区| 波多野结衣午夜| 中文字幕一精品亚洲无线一区 | 菠萝蜜视频国产在线播放| 国产欧美精品在线播放| 欧美成人激情| 青娱乐精品在线| 亚洲一二三四在线| 亚州av在线播放| 日韩美女在线看| 欧美日一区二区| 亚洲日本黄色片| 亚洲自拍偷拍九九九| 天天干免费视频| 日韩美女在线观看一区| 国产精品黑丝在线播放| japan高清日本乱xxxxx| 亚洲va天堂va国产va久| 加勒比一区二区三区在线| 国产精品色悠悠| 欧美在线视屏| 黑丝av在线播放| 在线观看三级视频欧美| 国产高清一区二区三区视频 | 亚洲欧美日韩国产成人精品影院| www.蜜臀av.com| 69av成年福利视频| 精品视频久久| 国产一区二区在线观看免费视频| 亚洲激情五月婷婷| 欧美美女搞黄| 国产在线高清精品| 在线欧美一区| 蜜桃久久精品成人无码av| 日韩视频一区二区在线观看| 中老年在线免费视频| 国产精品美女在线播放| www.亚洲国产| 国产精品久久久久久久久久久久久久久久 | 精品一区二区在线视频| 久久久久亚洲天堂| 亚洲香蕉成视频在线观看| 国产成人免费av一区二区午夜| 成人免费aaa| 自拍视频在线观看一区二区| 天天干天天色天天| 91精品在线看| 久久精品二区三区| 毛片a片免费观看| 中文字幕亚洲一区在线观看|