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

當(dāng)調(diào)用一個(gè) Python 對象時(shí),背后都經(jīng)歷了哪些過程?

開發(fā) 前端
我們就從 Python 和解釋器兩個(gè)層面解釋了對象是如何調(diào)用的,更準(zhǔn)確的說我們是從解釋器的角度對 Python 層面的知識進(jìn)行了驗(yàn)證,通過 tp_new 和 tp_init 的關(guān)系,來了解 __new__ 和 __init__ 的關(guān)系。

楔子

在上一篇文章中,我們分析了對象是如何創(chuàng)建的,主要有兩種方式,一種是通過特定類型 API,另一種是通過調(diào)用類型對象。

對于內(nèi)置類型的實(shí)例對象而言,這兩種方式都是支持的,比如列表,我們既可以通過 [ ] 創(chuàng)建,也可以通過 list() 創(chuàng)建,前者是列表的特定類型 API,后者是調(diào)用類型對象。

但對于自定義類的實(shí)例對象而言,我們只能通過調(diào)用類型對象的方式來創(chuàng)建。一個(gè)對象如果可以被調(diào)用,那么這個(gè)對象就是 callable,否則就不是 callable。而決定一個(gè)對象是不是 callable,則取決于它的類型對象。

  • 從 Python 的角度看,如果對象是 callable,那么它的類型對象一定實(shí)現(xiàn)了 __call__ 函數(shù);
  • 從解釋器的角度看,如果對象是 callable,那么它的類型對象的 tp_call 字段一定不為空。

從 Python 的角度看對象的調(diào)用

調(diào)用 int 可以創(chuàng)建一個(gè)整數(shù),調(diào)用 str 可以創(chuàng)建一個(gè)字符串,調(diào)用 tuple 可以創(chuàng)建一個(gè)元組,調(diào)用自定義的類也可以創(chuàng)建出相應(yīng)的實(shí)例對象,這就說明類型對象是可調(diào)用的,也就是 callable。

既然類型對象可調(diào)用,那么類型對象的類型對象(type)內(nèi)部一定實(shí)現(xiàn)了 __call__ 函數(shù)。

# int 可以調(diào)用,那么它的類型對象、也就是元類(type)
# 內(nèi)部一定實(shí)現(xiàn)了 __call__ 函數(shù)
print(hasattr(type, "__call__"))  # True

# 而調(diào)用一個(gè)對象,等價(jià)于調(diào)用其類型對象的 __call__ 函數(shù)
# 所以 int(2.71) 實(shí)際就等價(jià)于如下
print(type.__call__(int, 2.71))  # 2

我們說 int、str、float 這些都是類型對象(簡單來說就是類),而 123、"你好"、2.71 是其對應(yīng)的實(shí)例對象,這些都沒問題。但相對 type 而言,int、str、float 是不是又成了實(shí)例對象呢?因?yàn)樗鼈兊念愋褪?type。

所以 class 具有二象性:

  • 如果站在實(shí)例對象(如:123、"satori"、2.71)的角度上,它是類型對象;
  • 如果站在 type 的角度上,它是實(shí)例對象;

同理,由于 type 的類型還是 type,那么 type 既是 type 的類型對象,type 也是 type 的實(shí)例對象。雖然這里描述的有一些繞,但應(yīng)該不難理解,而為了避免后續(xù)的描述出現(xiàn)歧義,這里我們做一個(gè)申明:

  • 整數(shù)、浮點(diǎn)數(shù)、字符串、列表等等,我們稱之為實(shí)例對象
  • int、float、str、dict,以及自定義的類,我們稱之為類型對象
  • type 雖然也是類型對象,但我們稱它為元類

由于 type 的內(nèi)部定義了 __call__ 函數(shù),那么說明類型對象都是可調(diào)用的,因?yàn)檎{(diào)用類型對象就是調(diào)用元類 type 的 __call__ 函數(shù)。而實(shí)例對象能否調(diào)用就不一定了,這取決于它的類型對象是否定義了 __call__ 函數(shù),因?yàn)檎{(diào)用一個(gè)對象,本質(zhì)上是調(diào)用其類型對象內(nèi)部的 __call__ 函數(shù)。

class A:
    pass

a = A()
# 因?yàn)樽远x的類 A 里面沒有 __call__
# 所以 a 是不可以被調(diào)用的
try:
    a()
except Exception as e:
    # 告訴我們 A 的實(shí)例對象不可以被調(diào)用
    print(e)  # 'A' object is not callable

# 如果我們給 A 設(shè)置了一個(gè) __call__
type.__setattr__(A, "__call__", lambda self: "這是__call__")
# 發(fā)現(xiàn)可以調(diào)用了
print(a())  # 這是__call__

這就是動態(tài)語言的特性,即便在類創(chuàng)建完畢之后,依舊可以通過 type 進(jìn)行動態(tài)設(shè)置,而這在靜態(tài)語言中是不支持的。所以 type 是所有類的元類,它控制了自定義類的生成過程,因此 type 這個(gè)古老而又強(qiáng)大的類可以讓我們玩出很多新花樣。

但對于內(nèi)置的類,type 是不可以對其動態(tài)增加、刪除或者修改屬性的,因?yàn)閮?nèi)置的類在底層是靜態(tài)定義好的。從源碼中我們看到,這些內(nèi)置的類、包括元類,它們都是 PyTypeObject 對象,在底層已經(jīng)被聲明為全局變量了,或者說它們已經(jīng)作為靜態(tài)類存在了。所以 type 雖然是所有類型對象的類型,但只有在面對我們自定義的類,type 才具有對屬性進(jìn)行增刪改的能力。

而且在上一篇文章中我們也解釋過,Python 的動態(tài)性是解釋器將字節(jié)碼翻譯成 C 代碼的時(shí)候動態(tài)賦予的,因此給類對象動態(tài)設(shè)置屬性只適用于動態(tài)類,也就是在 py 文件中使用 class 關(guān)鍵字定義的類。

而對于靜態(tài)類,它們在編譯之后已經(jīng)是指向 C 一級的數(shù)據(jù)結(jié)構(gòu)了,不需要再被解釋器解釋了,因此解釋器自然也就無法在它們身上動手腳,畢竟彪悍的人生不需要解釋。

try:
    type.__setattr__(dict, "ping", "pong")
except Exception as e:
    print(e) 
    """
    cannot set 'ping' attribute of immutable type 'dict'
    """

try:
    type.__setattr__(list, "ping", "pong")
except Exception as e:
    print(e) 
    """
    cannot set 'ping' attribute of immutable type 'list'
    """

同理其實(shí)例對象亦是如此,靜態(tài)類的實(shí)例對象也不可以動態(tài)設(shè)置屬性:

lst = list()
try:
    lst.name = "古明地覺"
except Exception as e:
    print(e)  # 'list' object has no attribute 'name'

在介紹 PyTypeObject 結(jié)構(gòu)體的時(shí)候我們說過,靜態(tài)類的實(shí)例對象可以綁定哪些屬性,已經(jīng)寫死在 tp_members 字段里面了。

從解釋器的角度看對象的調(diào)用

以內(nèi)置類型 list 為例,我們說創(chuàng)建一個(gè)列表,可以通過 [ ] 或者 list() 的方式。前者使用列表的特定類型 API 創(chuàng)建,[ ] 會被直接解析成 C 一級的數(shù)據(jù)結(jié)構(gòu),也就是 PyListObject 實(shí)例;后者使用類型對象創(chuàng)建,對 list 進(jìn)行調(diào)用,最終也得到指向 C 一級的數(shù)據(jù)結(jié)構(gòu) PyListObject 實(shí)例。

第一種方式我們已經(jīng)很熟悉了,就是根據(jù)值來推斷在底層應(yīng)該對應(yīng)哪一種數(shù)據(jù)結(jié)構(gòu),然后直接創(chuàng)建即可,因?yàn)榻忉屍鲗?nèi)置的數(shù)據(jù)結(jié)構(gòu)了如指掌。我們重點(diǎn)來看第二種方式,也就是通過調(diào)用類型對象去創(chuàng)建實(shí)例對象。

如果一個(gè)對象可以被調(diào)用,那么它的類型對象中一定要有 tp_call,更準(zhǔn)確的說是 tp_call 字段的值是一個(gè)具體的函數(shù)指針,而不是 0。由于 PyList_Type 是可以調(diào)用的,這就說明 PyType_Type 內(nèi)部的 tp_call 是一個(gè)函數(shù)指針,這在 Python 的層面我們已經(jīng)驗(yàn)證過了,下面再來通過源碼看一下。

圖片圖片

在創(chuàng)建 PyType_Type 的時(shí)候,PyTypeObject 內(nèi)部的 tp_call 字段被設(shè)置成了 type_call。所以當(dāng)我們調(diào)用 PyList_Type 的時(shí)候,會執(zhí)行 type_call 函數(shù)。

因此 list() 在 C 的層面上等價(jià)于:

(&PyList_Type)->ob_type->tp_call(&PyList_Type, args, kwargs);
// 即:
(&PyType_Type)->tp_call(&PyList_Type, args, kwargs);
// 而在創(chuàng)建 PyType_Type 的時(shí)候,給 tp_call 字段傳遞的是 type_call
// 因此最終相當(dāng)于
type_call(&PyList_Type, args, kwargs)

如果用 Python 來演示這一過程的話:

# 以 list("abcd") 為例,它等價(jià)于
lst1 = list.__class__.__call__(list, "abcd")
# 等價(jià)于
lst2 = type.__call__(list, "abcd")
print(lst1)  # ['a', 'b', 'c', 'd']
print(lst2)  # ['a', 'b', 'c', 'd']

這就是 list() 的秘密,相信其它類型在實(shí)例化的時(shí)候是怎么做的,你已經(jīng)知道了,做法是相同的。

# dct = dict([("name", "古明地覺"), ("age", 17)])
dct = dict.__class__.__call__(
    dict, [("name", "古明地覺"), ("age", 17)]
)
print(dct)  # {'name': '古明地覺', 'age': 17}

# buf = bytes("hello world", encoding="utf-8")
buf = bytes.__class__.__call__(
    bytes, "hello world", encoding="utf-8"
)
print(buf)  # b'hello world'

當(dāng)然,目前還沒有結(jié)束,我們還需要看一下 type_call 的源碼實(shí)現(xiàn)。

type_call 源碼解析

調(diào)用類型對象,本質(zhì)上會調(diào)用 type.__call__,在底層對應(yīng) type_call 函數(shù),因?yàn)?PyType_Type 的 tp_call 字段被設(shè)置成了 type_call。當(dāng)然調(diào)用 type 也是如此,因?yàn)?type 的類型還是 type。

那么這個(gè) type_call 都做了哪些事情呢?

static PyObject *
type_call(PyTypeObject *type, PyObject *args, PyObject *kwds)
{   
    // 參數(shù) type 表示類型對象或者元類,假設(shè)調(diào)用的是 list,那么它就是 &PyList_Type
    // 參數(shù) args 和 kwds 表示位置參數(shù)和關(guān)鍵字參數(shù),args 是元組,kwds 是字典

    // 創(chuàng)建的實(shí)例對象,當(dāng)然也可能是類型對象,取決于參數(shù) type
    PyObject *obj;  
    // 線程狀態(tài)對象,后續(xù)介紹線程的時(shí)候會細(xì)說
    // 此處的線程狀態(tài)對象是用來設(shè)置異常的
    PyThreadState *tstate = _PyThreadState_GET();

    // 如果參數(shù) type 是 &PyType_Type,也就是 Python 中的元類
    if (type == &PyType_Type) {
        // 那么它只能接收一個(gè)位置參數(shù)(查看對象類型)或三個(gè)位置參數(shù)(動態(tài)創(chuàng)建類)
        Py_ssize_t nargs = PyTuple_GET_SIZE(args);  // 獲取位置參數(shù)的個(gè)數(shù)
        // 如果位置參數(shù)個(gè)數(shù)為 1,并且沒有傳遞關(guān)鍵字參數(shù),那么直接返回對象的類型
        if (nargs == 1 && (kwds == NULL || !PyDict_GET_SIZE(kwds))) {
            // Py_TYPE 負(fù)責(zé)獲取對象類型,因此相當(dāng)于 type(args[0])
            obj = (PyObject *) Py_TYPE(PyTuple_GET_ITEM(args, 0));
            // 增加引用計(jì)數(shù),返回 obj
            return Py_NewRef(obj);
        }

        // 如果位置參數(shù)的個(gè)數(shù)不等于 1,那么一定等于 3
        if (nargs != 3) {
            PyErr_SetString(PyExc_TypeError,
                            "type() takes 1 or 3 arguments");
            return NULL;
        }
    }
    // 接下來執(zhí)行類型對象(也可能是元類)的 tp_new,也就是 __new__
    // 如果不存在,那么會報(bào)錯,而在 Python 中見到的報(bào)錯信息就是這里指定的
    if (type->tp_new == NULL) {
        _PyErr_Format(tstate, PyExc_TypeError,
                      "cannot create '%s' instances", type->tp_name);
        return NULL;
    }
    // 執(zhí)行類型對象的 __new__
    obj = type->tp_new(type, args, kwds);
    // 檢測調(diào)用是否正常,如果調(diào)用正常,那么 obj 一定指向一個(gè)合法的 PyObject
    // 而如果 obj 為 NULL,則表示執(zhí)行出錯,此時(shí)解釋器會拋出異常
    obj = _Py_CheckFunctionResult(tstate, (PyObject*)type, obj, NULL);
    if (obj == NULL)
        return NULL;

    // __new__ 執(zhí)行完之后該執(zhí)行啥了,顯然是 __init__,但需要先做一個(gè)檢測
    // 如果 __new__ 返回的實(shí)例對象的類型不是當(dāng)前類型,那么直接返回,不再執(zhí)行 __init__
    // 比如自定義 class A,那么在 __new__ 里面應(yīng)該返回 A 的實(shí)例對象,但假設(shè)返回個(gè) 123
    // 由于返回值的類型不是當(dāng)前類型,那么不再執(zhí)行初始化函數(shù) __init__
    if (!PyObject_TypeCheck(obj, type))
        return obj;
    // 走到這里說明類型一致,那么執(zhí)行 __init__,將 obj、args、kwds 一起傳過去
    type = Py_TYPE(obj);
    if (type->tp_init != NULL) {
        int res = type->tp_init(obj, args, kwds);
        if (res < 0) {
            assert(_PyErr_Occurred(tstate));
            Py_SETREF(obj, NULL);
        }
        else {
            assert(!_PyErr_Occurred(tstate));
        }
    }
    // 返回創(chuàng)建的對象 obj
    return obj;
}

所以整個(gè)過程就三步:

  • 如果傳遞的是元類,并且只有一個(gè)參數(shù),那么直接返回對象的類型;
  • 否則先調(diào)用 tp_new 為實(shí)例對象申請內(nèi)存;
  • 再調(diào)用 tp_init(如果有)進(jìn)行初始化,設(shè)置對象屬性;

所以這對應(yīng)了 Python 中的 __new__ 和 __init__,其中 __new__ 負(fù)責(zé)為實(shí)例對象開辟一份內(nèi)存,然后返回指向?qū)ο蟮闹羔槪⑶以撝羔槙詣觽鬟f給 __init__ 中的 self。

class Girl:

    def __new__(cls, name, age):
        print("__new__ 方法執(zhí)行啦")
        # 調(diào)用 object.__new__(cls) 創(chuàng)建 Girl 的實(shí)例對象
        # 然后該對象的指針會自動傳遞給 __init__ 中的 self
        return object.__new__(cls)

    def __init__(self, name, age):
        print("__init__ 方法執(zhí)行啦")
        self.name = name
        self.age = age


g = Girl("古明地覺", 16)
print(g.name, g.age)
"""
__new__ 方法執(zhí)行啦
__init__ 方法執(zhí)行啦
古明地覺 16
"""

__new__ 里面的參數(shù)要和 __init__ 里面的參數(shù)保持一致,因?yàn)闀葓?zhí)行 __new__,然后解釋器再將 __new__ 的返回值和傳遞的參數(shù)組合起來一起傳給 __init__。因此從這個(gè)角度講,設(shè)置屬性完全可以在 __new__ 里面完成。

class Girl:

    def __new__(cls, name, age):
        self = object.__new__(cls)
        self.name = name
        self.age = age
        return self


g = Girl("古明地覺", 16)
print(g.name, g.age)
"""
古明地覺 16
"""

這樣也是沒問題的,不過 __new__ 一般只負(fù)責(zé)創(chuàng)建實(shí)例,設(shè)置屬性應(yīng)該交給 __init__ 來做,畢竟一個(gè)是構(gòu)造函數(shù)、一個(gè)是初始化函數(shù),各司其職。另外由于 __new__ 里面不負(fù)責(zé)初始化,那么它的參數(shù)除了 cls 之外,一般都會寫成 *args 和 **kwargs。

然后再回過頭來看一下 type_call 中的這兩行代碼:

圖片圖片

tp_new 應(yīng)該返回該類型對象的實(shí)例對象,而且一般情況下我們是不重寫 __new__ 的,會默認(rèn)執(zhí)行 object 的 __new__。但如果我們重寫了,那么必須要手動返回 object.__new__(cls)。可如果我們不返回,或者返回其它的話,會怎么樣呢?

class Girl:

    def __new__(cls, *args, **kwargs):
        print("__new__ 方法執(zhí)行啦")
        instance = object.__new__(cls)
        # 打印看看 instance 到底是個(gè)啥
        print("instance:", instance)
        print("type(instance):", type(instance))

        # 正確做法是將 instance 返回
        # 但是我們不返回,而是返回一個(gè)整數(shù) 123
        return 123

    def __init__(self, name, age):
        print("__init__ 方法執(zhí)行啦")


g = Girl()
"""
__new__ 方法執(zhí)行啦
instance: <__main__.Girl object at 0x0000019A2B7270A0>
type(instance): <class '__main__.Girl'>
"""

這里面有很多可以說的點(diǎn),首先就是 __init__ 里面需要兩個(gè)參數(shù),但是我們沒有傳,卻還不報(bào)錯。原因就在于這個(gè) __init__ 壓根就沒有執(zhí)行,因?yàn)?__new__ 返回的不是 Girl 的實(shí)例對象。

通過打印 instance,我們知道了 object.__new__(cls) 返回的就是 cls 的實(shí)例對象,而這里的 cls 就是 Girl 這個(gè)類本身。所以我們必須要返回 instance,才會自動執(zhí)行相應(yīng)的 __init__。

我們在外部來打印一下創(chuàng)建的實(shí)例對象吧,看看結(jié)果:

class Girl:

    def __new__(cls, *args, **kwargs):
        return 123

    def __init__(self, name, age):
        print("__init__ 方法執(zhí)行啦")


g = Girl()
print(g)
"""
123
"""

我們看到打印的結(jié)果是 123,所以再次總結(jié)一下 tp_new 和 tp_init 之間的區(qū)別,當(dāng)然也對應(yīng) __new__ 和 __init__ 的區(qū)別:

  • tp_new:為實(shí)例對象申請內(nèi)存,底層會調(diào)用 tp_alloc,至于對象的大小則記錄在 tp_basicsize 字段中,而在 Python 里面則是調(diào)用 object.__new__(cls),然后返回;
  • tp_init:tp_new 的返回值會自動傳遞給 self,然后為 self 綁定相應(yīng)的屬性,也就是進(jìn)行實(shí)例對象的初始化;

但如果 tp_new 返回的對象的類型不對,比如 type_call 的第一個(gè)參數(shù)接收的是 &PyList_Type,但 tp_new 返回的卻是 PyTupleObject *,那么此時(shí)就不會執(zhí)行 tp_init。

對應(yīng)上面的 Python 代碼就是,Girl 的 __new__ 應(yīng)該返回 Girl 的實(shí)例對象(指針)才對,但卻返回了整數(shù),因此類型不一致,不會執(zhí)行 __init__。

所以都說類在實(shí)例化的時(shí)候會先調(diào)用 __new__,再調(diào)用 __init__,相信你應(yīng)該知道原因了,因?yàn)樵谠创a中先調(diào)用 tp_new,再調(diào)用 tp_init。所以源碼層面表現(xiàn)出來的,和我們在 Python 層面看到的是一樣的。

小結(jié)

到此,我們就從 Python 和解釋器兩個(gè)層面解釋了對象是如何調(diào)用的,更準(zhǔn)確的說我們是從解釋器的角度對 Python 層面的知識進(jìn)行了驗(yàn)證,通過 tp_new 和 tp_init 的關(guān)系,來了解 __new__ 和 __init__ 的關(guān)系。

當(dāng)然對象調(diào)用還不止目前說的這么簡單,更多的細(xì)節(jié)隱藏在了幕后。后續(xù)我們會循序漸進(jìn),一點(diǎn)點(diǎn)地揭開它的面紗,并且在這個(gè)過程中還會不斷地學(xué)習(xí)到新的東西。比如說,實(shí)例對象在調(diào)用方法的時(shí)候會自動將實(shí)例本身作為參數(shù)傳遞給 self,那么它為什么會傳遞呢?解釋器在背后又做了什么工作呢?這些在之后的文章中都會詳細(xì)說明。

責(zé)任編輯:武曉燕 來源: 古明地覺的編程教室
相關(guān)推薦

2024-05-21 12:51:06

Python對象PyObject

2024-11-15 16:27:58

函數(shù)結(jié)構(gòu)存儲

2024-10-20 13:28:47

虛擬機(jī)字節(jié)碼CPU

2017-03-29 15:50:09

AndroidApp框架

2024-10-14 11:14:38

Python變量靜態(tài)

2015-03-09 17:49:40

SDN

2017-03-06 20:22:36

人工智能

2020-08-26 09:05:03

函數(shù)編譯詞法

2017-11-14 16:38:05

智慧新城

2023-10-30 23:14:57

瀏覽器URL網(wǎng)頁

2009-07-06 08:19:11

內(nèi)向女生求職經(jīng)歷

2016-01-29 10:32:32

KDEKDE PlatforQt 框架

2016-11-29 09:23:17

Spark集群部署

2022-09-27 08:19:20

前端React

2020-12-09 08:12:30

系統(tǒng)架構(gòu)

2020-10-27 07:29:43

架構(gòu)系統(tǒng)流量

2022-03-28 08:20:49

線程編程語言線程操作系統(tǒng)

2018-12-29 15:09:08

新零售無人超市智慧社區(qū)

2016-12-21 11:35:55

Python程序員

2017-06-12 15:53:40

程序員代碼編程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

欧美在线视频精品| 色屁屁草草影院ccyy.com| av文字幕在线观看| 国产成人亚洲综合a∨婷婷| 欧美大胆在线视频| 免费看毛片的网站| av成人免费| 亚洲综合色自拍一区| 久久精品ww人人做人人爽| 中文字幕天堂在线| 欧美久色视频| 国产一区二区欧美日韩| 图片区乱熟图片区亚洲| 中文字幕在线看片| 亚洲黄色av一区| 欧美日韩亚洲在线| 精品国产亚洲一区二区麻豆| 午夜一级在线看亚洲| 精品久久久av| 精品人妻一区二区三区日产乱码卜| 精品网站在线| 一区二区三区四区在线| 欧美亚洲国产免费| 免费的黄色av| 久久精品国产在热久久| 91a在线视频| 亚洲一级生活片| 国产乱码精品一区二区三区四区| 51午夜精品国产| 成人羞羞国产免费网站| 色图在线观看| 亚洲欧洲日本在线| 日韩av电影免费在线观看| 不卡视频在线播放| 久久er99热精品一区二区| 992tv成人免费影院| 男人的天堂久久久| 日韩中文欧美| 亚洲天堂日韩电影| 91视频啊啊啊| jazzjazz国产精品久久| 欧美精品久久天天躁| 久久精品99国产| av电影在线免费| 亚洲综合精品自拍| 99久re热视频精品98| 2021av在线| 欧美国产精品一区二区三区| 国模精品娜娜一二三区| 亚洲国产精品久久久久久6q | 国产精品va在线观看无码| 91在线品视觉盛宴免费| 久久久久九九视频| 国产精品中出一区二区三区| 国产xxxx在线观看| 激情欧美一区二区| 91精品久久久久久久| 中文字幕 欧美激情| 丝袜诱惑制服诱惑色一区在线观看| 97久久超碰福利国产精品…| 国产性生活网站| 欧美成人一品| 欧美激情视频免费观看| 久视频在线观看| 一区在线免费| 7777精品久久久久久| 国产在线观看黄色| 久久蜜桃精品| 国产精品99导航| 真实新婚偷拍xxxxx| 蜜桃精品视频在线| 国产日韩欧美日韩| av中文字幕免费在线观看| 国产美女视频一区| 波多野结衣久草一区| 免费a级片在线观看| 91免费视频大全| 日本一区不卡| 麻豆传媒在线完整视频| 一区二区三区在线免费视频| 日本a在线天堂| 国产黄色大片在线观看| 欧美日韩中国免费专区在线看| 色综合久久久久无码专区| 免费成人动漫| 欧美精品色一区二区三区| 在线观看免费视频污| 好吊妞视频这里有精品| 亚洲免费人成在线视频观看| 中文字幕黄色网址| 欧美福利影院| 欧美一区二区三区……| 一区精品在线观看| 国产iv一区二区三区| 久久99精品久久久久子伦| 黄色小视频在线观看| 亚洲欧洲成人精品av97| 欧美久久在线观看| 五月激情久久| 日韩你懂的在线观看| 99久久久久久久久久| 久久网站免费观看| 久久久久久国产精品久久| 国产伦精品一区二区三区视频网站| 男人的j进女人的j一区| 爱情岛论坛亚洲入口| 国产高清一区在线观看| 夜夜嗨av一区二区三区中文字幕| 日韩少妇内射免费播放18禁裸乳| 成人福利一区二区| 欧美精品一区二区三区在线播放 | 久久久精品视频网站 | 少妇熟女视频一区二区三区| 伊人久久大香线蕉综合网蜜芽| 日韩在线中文字幕| 国产成人无码精品| 国产一区欧美一区| 欧美一区二区福利| h片视频在线观看| 欧美日韩不卡一区| 亚洲成人黄色av| 一区在线免费观看| 91视频免费网站| 国产在线观看网站| 亚洲成人av在线电影| 蜜臀一区二区三区精品免费视频| 福利片一区二区| 久久久精品在线观看| 日本高清不卡码| 国产成a人无v码亚洲福利| 一区二区三区四区视频在线观看| 国产在线观看www| 欧美一二三区在线| 国产第一页精品| 日韩国产在线一| 精品乱子伦一区二区三区| а√天堂官网中文在线| 在线免费亚洲电影| 黄色工厂在线观看| 亚洲电影av| 粉嫩精品一区二区三区在线观看 | 日韩中文字幕在线看| 91精品国产综合久久久蜜臀九色| 国产一区在线不卡| 亚洲一区影院| 成人一区视频| 亚洲欧美制服中文字幕| 欧美三级韩国三级日本三斤在线观看| 国产剧情在线观看一区二区| 在线成人性视频| 韩日精品一区| 在线国产精品播放| 中文字幕在线观看视频免费| 99久久免费精品| 男女啪啪免费视频网站| 在线综合色站| 欧美黑人性视频| 国产黄色av网站| 亚洲日本va在线观看| 国产探花在线看| 五月婷婷六月综合| 91精品久久久久久久久久入口| 国产精品麻豆一区二区三区 | 久久69av| 久久成人免费视频| a在线观看免费| 亚洲精品国产一区二区三区四区在线| 伊人国产精品视频| 欧美 日韩 国产 一区| 成人综合色站| 51漫画成人app入口| 亚洲精品国产精品国自产观看浪潮| 日韩av一区二区在线播放| av色综合久久天堂av综合| 18岁网站在线观看| 亚洲精品蜜桃乱晃| 国产精品白嫩初高中害羞小美女| 91精品国产91久久久久游泳池| 欧美探花视频资源| 天天做夜夜爱爱爱| 国产**成人网毛片九色| 久久这里只有精品23| 中国av一区| 国产日产亚洲精品| 午夜av在线免费观看| 日韩av在线影院| 艳妇乳肉豪妇荡乳av无码福利| 中文字幕亚洲一区二区va在线| 在线免费黄色小视频| 国产精品久久久久9999高清| 日韩在线电影一区| 亚洲视频精选| 日韩av手机在线| 国产人成网在线播放va免费| 精品国产免费视频| 九九精品免费视频| 亚洲欧洲在线观看av| 天天躁日日躁狠狠躁av麻豆男男 | 男人的天堂a在线| 91久久免费观看| 男女性高潮免费网站| 久久天天做天天爱综合色| 久久国产精品国产精品| 国产综合久久| 先锋影音一区二区三区| 视频在线观看免费影院欧美meiju| 91精品国产91久久久| 欧美激情办公室videoshd| 亚洲国产精品成人va在线观看| 中文字幕理论片| 亚洲成人av电影在线| 免费一级suv好看的国产网站| 国产精品系列在线播放| 国产精品亚洲二区在线观看| 欧美精品网站| 亚洲免费视频一区| 欧美重口另类| 亚洲tv在线观看| 日韩高清在线| 97精品一区二区三区| 国产午夜精品久久久久免费视| 亚洲免费av网址| 亚洲精品久久久久久久久久久久久久 | 日韩一级片网站| 久久午夜鲁丝片| 激情懂色av一区av二区av| 我要看黄色一级片| 中文字幕精品在线不卡| 一边摸一边做爽的视频17国产| 美国一区二区三区在线播放| 国产97在线 | 亚洲| 欧美另类视频| 亚洲精品在线免费| 免费看成人哺乳视频网站| 97视频资源在线观看| 国产精品久久久久久久久免费高清 | 亚州av在线播放| 欧美一区二区福利在线| 伊人免费在线观看高清版| 欧美丝袜第一区| 四虎永久在线精品| 一区二区三区免费网站| www日韩在线| 国产精品传媒在线| 337人体粉嫩噜噜噜| wwww国产精品欧美| 国产ts丝袜人妖系列视频| 豆国产96在线|亚洲| 九九九久久久久久久| 国产一区二区精品久久99| 污污网站免费观看| 欧美a级一区二区| 99免费视频观看| 欧美在线综合| 免费无码国产v片在线观看| 在线日本高清免费不卡| 日本大片免费看| 亚洲天堂久久| 给我免费播放片在线观看| 亚洲大胆视频| 久久亚洲中文字幕无码| 亚洲伦伦在线| 国模吧无码一区二区三区| 99国产精品久久久久久久| 国产精品久久中文字幕| 亚洲大胆视频| 精品www久久久久奶水| 久久精品五月| a在线观看免费视频| 久久99精品国产.久久久久久| 欧美三级午夜理伦三级富婆| 蜜臀精品一区二区三区在线观看 | 欧美岛国在线观看| 色香蕉在线视频| 亚洲欧美色婷婷| aiai在线| 欧美xxxx18国产| 国产网红在线观看| 奇米影视亚洲狠狠色| 香蕉成人av| 国产在线精品一区免费香蕉 | 国产亚洲一级| 青青青国产在线视频| 蜜桃91丨九色丨蝌蚪91桃色| 亚洲自拍第三页| 不卡av电影在线播放| 色噜噜日韩精品欧美一区二区| 中文av一区特黄| 免费三片在线播放| 欧美日韩在线免费观看| 天堂网一区二区| 欧美一区二区三区在| 六月丁香综合网| 国产一区二区欧美日韩| 国产在线观看免费麻豆| 午夜精品久久久久久久99热| 性欧美freehd18| 99高清视频有精品视频| 综合干狼人综合首页| 国产成人三级视频| 99精品久久| 国产精欧美一区二区三区白种人| 成人永久免费视频| 嘿嘿视频在线观看| 午夜伦欧美伦电影理论片| 制服丝袜在线一区| 亚洲成色777777女色窝| 1769视频在线播放免费观看| 欧美黄色片在线观看| 日韩av一级| 国产综合 伊人色| 91成人精品| 男女啪啪网站视频| 成人精品视频一区| 91动漫免费网站| 色综合色综合色综合| 亚洲高清视频网站| 日韩在线观看你懂的| 欲香欲色天天天综合和网| 亚洲在线免费视频| 日本久久黄色| 久久久噜噜噜www成人网| 国产成a人亚洲精| 中文字幕求饶的少妇| 色呦呦网站一区| 天天摸夜夜添狠狠添婷婷| 久久国产精品久久国产精品| 日韩欧美看国产| 国产免费一区二区| 午夜精彩国产免费不卡不顿大片| 88av.com| 91亚洲精品久久久蜜桃网站| 激情综合五月网| 欧美一区二区三区人| 色综合久久影院| 国产精品69久久久久| 视频小说一区二区| 国产综合av在线| 成人h版在线观看| 久久国产精品波多野结衣| 欧美美女网站色| 97超碰国产一区二区三区| 欧美专区福利在线| 偷拍精品福利视频导航| 日韩精品在线中文字幕| 国产精品一二三四五| 亚洲欧美卡通动漫| 亚洲高清视频在线| 免费a级片在线观看| 欧美精品videosex牲欧美| 日本免费高清不卡| 性色一区二区三区| 蜜桃av免费看| 色综合av在线| 爱爱爱免费视频在线观看| 国产精品高潮呻吟久久av无限 | 日韩亚洲欧美一区二区三区| 久草资源在线| 91探花福利精品国产自产在线| 91亚洲自偷观看高清| 一级淫片在线观看| 亚洲免费在线观看视频| 精品免费久久久| 久久露脸国产精品| 色吊丝一区二区| 国产日韩成人内射视频| 欧美国产欧美亚州国产日韩mv天天看完整| av毛片在线免费观看| 伊人伊成久久人综合网小说| 欧美久久久网站| 91免费网站视频| 国产99精品视频| 日韩黄色在线视频| 亚洲欧美中文另类| 青娱乐极品盛宴一区二区| 91xxx视频| 成人99免费视频| 亚洲国产av一区二区三区| 色噜噜亚洲精品中文字幕| 国产精品久久久久久久久久齐齐 | 蜜桃视频在线观看免费视频网站www| 91av在线看| 三区四区不卡| 日本一本在线视频| 欧美日韩国产精品一区二区三区四区| 国产永久免费高清在线观看 | 欧美高清xxx| av在线com| 久久精子c满五个校花| 国产尤物视频在线观看| 久久久人成影片一区二区三区观看| 偷拍亚洲精品| 911av视频| 色综合久久中文综合久久97| 国产福利视频在线观看| 激情久久av| 久久精品国产久精国产| 久久久久久久久精| 中文字幕在线视频日韩| 国产66精品|