中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

Python中的Classes和Metaclasses詳解
來(lái)源:易賢網(wǎng) 閱讀:1177 次 日期:2015-04-24 11:14:35
溫馨提示:易賢網(wǎng)小編為您整理了“Python中的Classes和Metaclasses詳解”,方便廣大網(wǎng)友查閱!

類(lèi)和對(duì)象

類(lèi)和函數(shù)一樣都是Python中的對(duì)象。當(dāng)一個(gè)類(lèi)定義完成之后,Python將創(chuàng)建一個(gè)“類(lèi)對(duì)象”并將其賦值給一個(gè)同名變量。類(lèi)是type類(lèi)型的對(duì)象(是不是有點(diǎn)拗口?)。

類(lèi)對(duì)象是可調(diào)用的(callable,實(shí)現(xiàn)了 __call__方法),并且調(diào)用它能夠創(chuàng)建類(lèi)的對(duì)象。你可以將類(lèi)當(dāng)做其他對(duì)象那么處理。例如,你能夠給它們的屬性賦值,你能夠?qū)⑺鼈冑x值給一個(gè)變量,你可以在任何可調(diào)用對(duì)象能夠用的地方使用它們,比如在一個(gè)map中。事實(shí)上當(dāng)你在使用map(str, [1,2,3])的時(shí)候,是將一個(gè)整數(shù)類(lèi)型的list轉(zhuǎn)換為字符串類(lèi)型的list,因?yàn)閟tr是一個(gè)類(lèi)。可以看看下面的代碼:

>>> class C(object):

... def __init__(self, s):

... print s

...

>>> myclass = C

>>> type(C)

<type 'type'>

>>> type(myclass)

<type 'type'>

>>> myclass(2)

<__main__.C object at 0x10e2bea50>

>>> map(myclass, [1,2,3])

[<__main__.C object at 0x10e2be9d0>, <__main__.C object at 0x10e2bead0>, <__main__.C object at 0x10e2beb10>]

>>> map(C, [1,2,3])

[<__main__.C object at 0x10e2be950>, <__main__.C object at 0x10e2beb50>, <__main__.C object at 0x10e2beb90>]

>>> C.test_attribute = True

>>> myclass.test_attribute

True

正因如此,Python中的“class”關(guān)鍵字不像其他語(yǔ)言(例如C++)那樣必須出現(xiàn)在代碼main scope中。在Python中,它能夠在一個(gè)函數(shù)中嵌套出現(xiàn),舉個(gè)例子,我們能夠這樣在函數(shù)運(yùn)行的過(guò)程中動(dòng)態(tài)的創(chuàng)建類(lèi)。看代碼:

>>> def make_class(class_name):

... class C(object):

... def print_class_name(self):

... print class_name

... C.__name__ = class_name

... return C

...

>>> C1, C2 = map(make_class, ["C1", "C2"])

>>> c1, c2 = C1(), C2()

>>> c1.print_class_name()

C1

>>> c2.print_class_name()

C2

>>> type(c1)

<class '__main__.C1'>

>>> type(c2)

<class '__main__.C2'>

>>> c1.print_class_name.__closure__

(<cell at 0x10ab6dbe8: str object at 0x10ab71530>,)

請(qǐng)注意,在這里通過(guò)make_class創(chuàng)建的兩個(gè)類(lèi)是不同的對(duì)象,因此通過(guò)它們創(chuàng)建的對(duì)象就不屬于同一個(gè)類(lèi)型。正如我們?cè)谘b飾器中做的那樣,我們?cè)陬?lèi)被創(chuàng)建之后手動(dòng)設(shè)置了類(lèi)名。同樣也請(qǐng)注意所創(chuàng)建類(lèi)的print_class_name方法在一個(gè)closure cell中捕捉到了類(lèi)的closure和class_name。如果你對(duì)closure的概念還不是很清楚,那么最好去看看前篇,復(fù)習(xí)一下closures和decorators相關(guān)的內(nèi)容。

Metaclasses

如果類(lèi)是能夠制造對(duì)象的對(duì)象,那制造類(lèi)的對(duì)象又該叫做什么呢(相信我,這并不是一個(gè)先有雞還是先有蛋的問(wèn)題)?答案是元類(lèi)(Metaclasses)。大部分常見(jiàn)的基礎(chǔ)元類(lèi)都是type。當(dāng)輸入一個(gè)參數(shù)時(shí),type將簡(jiǎn)單的返回輸入對(duì)象的類(lèi)型,這就不涉及元類(lèi)。然而當(dāng)輸入三個(gè)參數(shù)時(shí),type將扮演元類(lèi)的角色,基于輸入?yún)?shù)創(chuàng)建一個(gè)類(lèi)并返回。輸入?yún)?shù)相當(dāng)簡(jiǎn)單:類(lèi)名,父類(lèi)及其參數(shù)的字典。后面兩者可以為空,來(lái)看一個(gè)例子:

>>> MyClass = type("MyClass", (object,), {"my_attribute": 0})

>>> type(MyClass)

<type 'type'>

>>> o = MyClass()

>>> o.my_attribute

0

特別注意第二個(gè)參數(shù)是一個(gè)tuple(語(yǔ)法看起來(lái)很奇怪,以逗號(hào)結(jié)尾)。如果你需要在類(lèi)中安排一個(gè)方法,那么創(chuàng)建一個(gè)函數(shù)并且將其以屬性的方式傳遞作為第三個(gè)參數(shù),像這樣:

>>> def myclass_init(self, my_attr):

... self.my_attribute = my_attr

...

>>> MyClass = type("MyClass", (object,), {"my_attribute": 0, "__init__": myclass_init})

>>> o = MyClass("Test")

>>> o.my_attribute

'Test'

>>> o.__init__

<bound method MyClass.myclass_init of <__main__.MyClass object at 0x10ab72150>>

我們可以通過(guò)一個(gè)可調(diào)用對(duì)象(函數(shù)或是類(lèi))來(lái)自定義元類(lèi),這個(gè)對(duì)象需要三個(gè)輸入?yún)?shù)并返回一個(gè)對(duì)象。這樣一個(gè)元類(lèi)在一個(gè)類(lèi)上實(shí)現(xiàn)只要定義了它的__metaclass__屬性。第一個(gè)例子,讓我們做一些有趣的事情看看我們能夠用元類(lèi)做些什么:

>>> def mymetaclass(name, parents, attributes):

... return "Hello"

...

>>> class C(object):

... __metaclass__ = mymetaclass

...

>>> print C

Hello

>>> type(C)

<type 'str'>

請(qǐng)注意以上的代碼,C只是簡(jiǎn)單地將一個(gè)變量引用指向了字符串“Hello”。當(dāng)然了,沒(méi)人會(huì)在實(shí)際中寫(xiě)這樣的代碼,這只是為了演示元類(lèi)的用法而舉的一個(gè)簡(jiǎn)單例子。接下來(lái)我們來(lái)做一些更有用的操作。在本系列的第二部分我們?cè)吹饺绾问褂醚b飾器類(lèi)來(lái)記錄目標(biāo)類(lèi)每個(gè)方法的輸出,現(xiàn)在我們來(lái)做同樣的事情,不過(guò)這一次我們使用元類(lèi)。我們借用之前的裝飾器定義:

def log_everything_metaclass(class_name, parents, attributes):

print "Creating class", class_name

myattributes = {}

for name, attr in attributes.items():

myattributes[name] = attr

if hasattr(attr, '__call__'):

myattributes[name] = logged("%b %d %Y - %H:%M:%S",

class_name + ".")(attr)

return type(class_name, parents, myattributes)

class C(object):

__metaclass__ = log_everything_metaclass

def __init__(self, x):

self.x = x

def print_x(self):

print self.x

# Usage:

print "Starting object creation"

c = C("Test")

c.print_x()

# Output:

Creating class C

Starting object creation

- Running 'C.__init__' on Aug 05 2013 - 13:50:58

- Finished 'C.__init__', execution time = 0.000s

- Running 'C.print_x' on Aug 05 2013 - 13:50:58

Test

- Finished 'C.print_x', execution time = 0.000s

如你所見(jiàn),類(lèi)裝飾器與元類(lèi)有著很多共同點(diǎn)。事實(shí)上,任何能夠用類(lèi)裝飾器完成的功能都能夠用元類(lèi)來(lái)實(shí)現(xiàn)。類(lèi)裝飾器有著很簡(jiǎn)單的語(yǔ)法結(jié)構(gòu)易于閱讀,所以提倡使用。但就元類(lèi)而言,它能夠做的更多,因?yàn)樗陬?lèi)被創(chuàng)建之前就運(yùn)行了,而類(lèi)裝飾器則是在類(lèi)創(chuàng)建之后才運(yùn)行的。記住這點(diǎn),讓我們來(lái)同時(shí)運(yùn)行一下兩者,請(qǐng)注意運(yùn)行的先后順序:

def my_metaclass(class_name, parents, attributes):

print "In metaclass, creating the class."

return type(class_name, parents, attributes)

def my_class_decorator(class_):

print "In decorator, chance to modify the class."

return class_

@my_class_decorator

class C(object):

__metaclass__ = my_metaclass

def __init__(self):

print "Creating object."

c = C()

# Output:

In metaclass, creating the class.

In decorator, chance to modify the class.

Creating object.

元類(lèi)的一個(gè)實(shí)際用例

讓我們來(lái)考慮一個(gè)更有用的實(shí)例。假設(shè)我們正在構(gòu)思一個(gè)類(lèi)集合來(lái)處理MP3音樂(lè)文件中使用到的ID3v2標(biāo)簽Wikipedia。簡(jiǎn)而言之,標(biāo)簽由幀(frames)組成,而每幀通過(guò)一個(gè)四字符的識(shí)別碼(identifier)進(jìn)行標(biāo)記。舉個(gè)例子,TOPE標(biāo)識(shí)了原作者幀,TOAL標(biāo)識(shí)了原專(zhuān)輯名稱(chēng)等。如果我們希望為每個(gè)幀類(lèi)型寫(xiě)一個(gè)單獨(dú)的類(lèi),并且允許ID3v2標(biāo)簽庫(kù)用戶自定義他們自己的幀類(lèi)。那么我們可以使用元類(lèi)來(lái)實(shí)現(xiàn)一個(gè)類(lèi)工廠模式,具體實(shí)現(xiàn)方式可以這樣:

frametype_class_dict = {}

class ID3v2FrameClassFactory(object):

def __new__(cls, class_name, parents, attributes):

print "Creating class", class_name

# Here we could add some helper methods or attributes to c

c = type(class_name, parents, attributes)

if attributes['frame_identifier']:

frametype_class_dict[attributes['frame_identifier']] = c

return c

@staticmethod

def get_class_from_frame_identifier(frame_identifier):

return frametype_class_dict.get(frame_identifier)

class ID3v2Frame(object):

frame_identifier = None

__metaclass__ = ID3v2FrameClassFactory

pass

class ID3v2TitleFrame(ID3v2Frame):

__metaclass__ = ID3v2FrameClassFactory

frame_identifier = "TIT2"

class ID3v2CommentFrame(ID3v2Frame):

__metaclass__ = ID3v2FrameClassFactory

frame_identifier = "COMM"

title_class = ID3v2FrameClassFactory.get_class_from_frame_identifier('TIT2')

comment_class = ID3v2FrameClassFactory.get_class_from_frame_identifier('COMM')

print title_class

print comment_class

# Output:

Creating class ID3v2Frame

Creating class ID3v2TitleFrame

Creating class ID3v2CommentFrame

<class '__main__.ID3v2TitleFrame'>

<class '__main__.ID3v2CommentFrame'>

當(dāng)然了,以上的代碼同樣可以用類(lèi)裝飾器來(lái)完成,以下是對(duì)應(yīng)代碼:

frametype_class_dict = {}

class ID3v2FrameClass(object):

def __init__(self, frame_id):

self.frame_id = frame_id

def __call__(self, cls):

print "Decorating class", cls.__name__

# Here we could add some helper methods or attributes to c

if self.frame_id:

frametype_class_dict[self.frame_id] = cls

return cls

@staticmethod

def get_class_from_frame_identifier(frame_identifier):

return frametype_class_dict.get(frame_identifier)

@ID3v2FrameClass(None)

class ID3v2Frame(object):

pass

@ID3v2FrameClass("TIT2")

class ID3v2TitleFrame(ID3v2Frame):

pass

@ID3v2FrameClass("COMM")

class ID3v2CommentFrame(ID3v2Frame):

pass

title_class = ID3v2FrameClass.get_class_from_frame_identifier('TIT2')

comment_class = ID3v2FrameClass.get_class_from_frame_identifier('COMM')

print title_class

print comment_class

Decorating class ID3v2Frame

Decorating class ID3v2TitleFrame

Decorating class ID3v2CommentFrame

<class '__main__.ID3v2TitleFrame'>

<class '__main__.ID3v2CommentFrame'>

如你所見(jiàn),我們可以直接給裝飾器傳遞參數(shù),而元類(lèi)卻不能。給元類(lèi)傳遞參數(shù)必須通過(guò)屬性。正因如此,這里裝飾器的解決方案更為清晰,同時(shí)也更容易維護(hù)。然而,同時(shí)也需要注意當(dāng)裝飾器被調(diào)用的時(shí)候,類(lèi)已經(jīng)建立完畢,這意味著此時(shí)就不能夠修改其屬性了。例如,一旦類(lèi)建立完成,你就不能夠修改__doc__。來(lái)看實(shí)際例子:

>>> def mydecorator(cls):

... cls.__doc__ = "Test!"

... return cls

...

>>> @mydecorator

... class C(object):

... """Docstring to be replaced with Test!"""

... pass

...

Traceback (most recent call last):

File "<stdin>", line 2, in <module>

File "<stdin>", line 2, in mydecorator

AttributeError: attribute '__doc__' of 'type' objects is not writable

>>> def mymetaclass(cls, parents, attrs):

... attrs['__doc__'] = 'Test!'

... return type(cls, parents, attrs)

...

>>> class D(object):

... """Docstring to be replaced with Test!"""

... __metaclass__ = mymetaclass

...

>>> D.__doc__

'Test!'

通過(guò)type生成元類(lèi)

正如我們所說(shuō),最基本的元類(lèi)就是type并且類(lèi)通常都是type類(lèi)型。那么問(wèn)題很自然來(lái)了,type類(lèi)型本身是一種什么類(lèi)型呢?答案也是type。這也就是說(shuō)type就是它自身的元類(lèi)。雖然聽(tīng)起來(lái)有點(diǎn)詭異,但這在Python解釋器層面而言是可行的。

type自身就是一個(gè)類(lèi),并且我們可以從它繼承出新類(lèi)。這些生成的類(lèi)也能作為元類(lèi),并且使用它們的類(lèi)可以得到跟使用type一樣的類(lèi)型。來(lái)看以下的例子:

>>> class meta(type):

... def __new__(cls, class_name, parents, attributes):

... print "meta.__new__"

... return super(meta, cls).__new__(cls, class_name, parents, attributes)

... def __call__(self, *args, **kwargs):

... print "meta.__call__"

... return super(meta, self).__call__(*args, **kwargs)

...

>>> class C(object):

... __metaclass__ = meta

...

meta.__new__

>>> c = C()

meta.__call__

>>> type(C)

<class '__main__.meta'>

請(qǐng)注意當(dāng)類(lèi)創(chuàng)建對(duì)象時(shí),元類(lèi)的__call__函數(shù)就被調(diào)用,進(jìn)而調(diào)用type.__call__創(chuàng)建對(duì)象。在下一節(jié),我們將把上面的內(nèi)容融合在一起。

要點(diǎn)集合

假定一個(gè)類(lèi)C自己的元類(lèi)為my_metaclass并被裝飾器my_class_decorator裝飾。并且,假定my_metaclass本身就是一個(gè)類(lèi),從type生成。讓我們將上面提到的內(nèi)容融合到一起做一個(gè)總結(jié)來(lái)顯示C類(lèi)以及它的對(duì)象都是怎么被創(chuàng)建的。首先,讓我們來(lái)看看代碼:

class my_metaclass(type):

def __new__(cls, class_name, parents, attributes):

print "- my_metaclass.__new__ - Creating class instance of type", cls

return super(my_metaclass, cls).__new__(cls,

class_name,

parents,

attributes)

def __init__(self, class_name, parents, attributes):

print "- my_metaclass.__init__ - Initializing the class instance", self

super(my_metaclass, self).__init__(self)

def __call__(self, *args, **kwargs):

print "- my_metaclass.__call__ - Creating object of type ", self

return super(my_metaclass, self).__call__(*args, **kwargs)

def my_class_decorator(cls):

print "- my_class_decorator - Chance to modify the class", cls

return cls

@my_class_decorator

class C(object):

__metaclass__ = my_metaclass

def __new__(cls):

print "- C.__new__ - Creating object."

return super(C, cls).__new__(cls)

def __init__(self):

print "- C.__init__ - Initializing object."

c = C()

print "Object c =", c

現(xiàn)在,你可以花幾分鐘時(shí)間測(cè)試一下你的理解,并且猜一猜打印輸出的順序。

首先,讓我們來(lái)看看Python的解釋器是如何閱讀這部分代碼的,然后我們會(huì)對(duì)應(yīng)輸出來(lái)加深我們的理解。

1. Python首先看類(lèi)聲明,準(zhǔn)備三個(gè)傳遞給元類(lèi)的參數(shù)。這三個(gè)參數(shù)分別為類(lèi)名(class_name),父類(lèi)(parent)以及屬性列表(attributs)。

2. Python會(huì)檢查_(kāi)_metaclass__屬性,如果設(shè)置了此屬性,它將調(diào)用metaclass,傳遞三個(gè)參數(shù),并且返回一個(gè)類(lèi)。

3. 在這個(gè)例子中,metaclass自身就是一個(gè)類(lèi),所以調(diào)用它的過(guò)程類(lèi)似創(chuàng)建一個(gè)新類(lèi)。這就意味著my_metaclass.__new__將首先被調(diào)用,輸入四個(gè)參數(shù),這將新建一個(gè)metaclass類(lèi)的實(shí)例。然后這個(gè)實(shí)例的my_metaclass.__init__將被調(diào)用調(diào)用結(jié)果是作為一個(gè)新的類(lèi)對(duì)象返回。所以此時(shí)C將被設(shè)置成這個(gè)類(lèi)對(duì)象。

4. 接下來(lái)Python將查看所有裝飾了此類(lèi)的裝飾器。在這個(gè)例子中,只有一個(gè)裝飾器。Python將調(diào)用這個(gè)裝飾器,將從元類(lèi)哪里得到的類(lèi)傳遞給它作為參數(shù)。然后這個(gè)類(lèi)將被裝飾器返回的對(duì)象所替代。

5. 裝飾器返回的類(lèi)類(lèi)型與元類(lèi)設(shè)置的相同。

6. 當(dāng)類(lèi)被調(diào)用創(chuàng)建一個(gè)新的對(duì)象實(shí)例時(shí),因?yàn)轭?lèi)的類(lèi)型是metaclass,因此Python將會(huì)調(diào)用元類(lèi)的__call__方法。在這個(gè)例子中,my_metaclass.__call__只是簡(jiǎn)單的調(diào)用了type.__call__,目的是創(chuàng)建一個(gè)傳遞給它的類(lèi)的對(duì)象實(shí)例。

7. 下一步type.__call__通過(guò)C.__new__創(chuàng)建一個(gè)對(duì)象。

8. 最后type.__call__通過(guò)C.__new__返回的結(jié)果運(yùn)行C.__init__。

9. 返回的對(duì)象已經(jīng)準(zhǔn)備完畢。

所以基于以上的分析,我們可以看到調(diào)用的順序如下:my_metaclass.__new__首先被調(diào)用,然后是my_metaclass.__init__,然后是my_class_decorator。至此C類(lèi)已經(jīng)準(zhǔn)備完畢(返回結(jié)果就是C)。當(dāng)我們調(diào)用C來(lái)創(chuàng)建一個(gè)對(duì)象的時(shí)候,首先會(huì)調(diào)用my_metaclass.__call__(任何對(duì)象被創(chuàng)建的時(shí)候,Python都首先會(huì)去調(diào)用其類(lèi)的__call__方法),然后C.__new__將會(huì)被type.__call__調(diào)用(my_metaclass.__call__簡(jiǎn)單調(diào)用了type.__call__),最后是C.__init__被調(diào)用。現(xiàn)在讓我們來(lái)看看輸出:

- my_metaclass.__new__ - Creating class instance of type <class '__main__.my_metaclass'>

- my_metaclass.__init__ - Initializing the class instance <class '__main__.C'>

- my_class_decorator - Chance to modify the class <class '__main__.C'>

- my_metaclass.__call__ - Creating object of type <class '__main__.C'>

- C.__new__ - Creating object.

- C.__init__ - Initializing object.

Object c = <__main__.C object at 0x1043feb90> <class '__main__.C'>

關(guān)于元類(lèi)多說(shuō)幾句

元類(lèi),一門(mén)強(qiáng)大而晦澀的技法。在GitHub上搜索__metaclass__得到的結(jié)果多半是指向”cookbook”或其他Python教學(xué)材料的鏈接。一些測(cè)試用例(諸如Jython中的一些測(cè)試用例),或是其他一些寫(xiě)有__metaclass__ = type的地方只是為了確保新類(lèi)被正常使用了。坦白地說(shuō),這些用例都沒(méi)有真正地使用元類(lèi)。過(guò)濾了下結(jié)果,我只能找到兩個(gè)地方真正使用了元類(lèi):ABCMeta和djangoplugins。

ABCMeta是一個(gè)允許注冊(cè)抽象基類(lèi)的元類(lèi)。如果想了解多些請(qǐng)查看其官方文檔,本文將不會(huì)討論它。

對(duì)于djangoplugins而言,基本的思想是基于這篇文章article on a simple plugin framework for Python,使用元類(lèi)是為了創(chuàng)建一個(gè)插件掛載系統(tǒng)。我并沒(méi)有對(duì)其有深入的研究,不過(guò)我感覺(jué)這個(gè)功能可以使用裝飾器來(lái)實(shí)現(xiàn)。如果你有相關(guān)的想法請(qǐng)?jiān)?本文后留言。

總結(jié)筆記

通過(guò)理解元類(lèi)能夠幫助我們更深入的理解Python中類(lèi)和對(duì)象的行為,現(xiàn)實(shí)中使用它們的情況可能比文中的例子要復(fù)雜得多。大部分元類(lèi)完成的功能都可以使用裝飾器來(lái)實(shí)現(xiàn)。所以當(dāng)你的第一直覺(jué)是使用元類(lèi)來(lái)解決你的問(wèn)題,那么請(qǐng)你停下來(lái)先想想這是否必要。如果不是非要使用元類(lèi),那么請(qǐng)三思而行。這會(huì)使你的代碼更易懂,更易調(diào)試和維護(hù)。

更多信息請(qǐng)查看IT技術(shù)專(zhuān)欄

更多信息請(qǐng)查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:Python中的Classes和Metaclasses詳解
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門(mén)公布的正式信息和咨詢?yōu)闇?zhǔn)!

2026上岸·考公考編培訓(xùn)報(bào)班

  • 報(bào)班類(lèi)型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專(zhuān)用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專(zhuān)用圖標(biāo)
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
宅男在线国产精品| 亚洲午夜在线视频| 欧美体内谢she精2性欧美| 欧美日韩精品免费观看视频完整| 欧美日韩一区二区在线| 国产精品视频大全| 亚洲成人自拍视频| 亚洲午夜成aⅴ人片| 久久国产精品99久久久久久老狼| 噜噜噜噜噜久久久久久91| 欧美日韩无遮挡| 狠狠久久亚洲欧美专区| 一本久道久久综合婷婷鲸鱼| 久久久噜噜噜久久中文字免| 欧美日韩影院| 亚洲国产成人精品视频| 欧美亚洲日本一区| 欧美日韩免费观看一区二区三区| 国产在线视频欧美| 亚洲一级电影| 欧美大片在线观看一区| 国产欧美日韩三区| 亚洲一区二区三区四区中文| 欧美国产日韩一区二区在线观看| 国产欧美日韩另类视频免费观看| 亚洲毛片播放| 免费欧美日韩| 狠狠入ady亚洲精品经典电影| 在线综合亚洲| 欧美伦理影院| 亚洲韩国青草视频| 久久精品一区二区国产| 国产精品亚洲激情 | 一区二区三区四区五区精品视频 | 欧美性视频网站| 91久久精品网| 美女视频网站黄色亚洲| 国产一级久久| 亚洲欧美一区二区视频| 欧美日韩综合视频| 日韩亚洲欧美中文三级| 美女日韩欧美| 亚洲高清123| 免费久久久一本精品久久区| 好吊一区二区三区| 欧美一区二区三区免费视频| 欧美日韩亚洲一区二区三区在线 | 欧美亚洲日本国产| 国产精品日本精品| 亚洲欧美日韩在线播放| 国产精品美女诱惑| 亚洲欧美日韩国产一区| 国产精品视频久久一区| 欧美一级二区| 激情视频一区| 免费在线观看一区二区| 亚洲黄色影院| 欧美日韩国产高清| 亚洲一区二区三区777| 国产精品普通话对白| 亚欧美中日韩视频| 伊人久久大香线蕉综合热线 | 国产主播一区二区三区四区| 欧美一区视频| 尤物精品在线| 欧美激情精品久久久久久蜜臀| 亚洲精品小视频| 欧美日韩综合网| 欧美亚洲一区二区在线| 精品白丝av| 欧美连裤袜在线视频| 亚洲一区二区成人| 国产婷婷一区二区| 欧美刺激午夜性久久久久久久| 亚洲精品女人| 国产精品国产三级欧美二区| 亚洲欧美在线高清| 在线欧美日韩精品| 欧美日韩美女一区二区| 亚洲欧美一区二区精品久久久| 国产日韩欧美自拍| 欧美成年视频| 中国成人在线视频| 黑人操亚洲美女惩罚| 欧美激情亚洲视频| 欧美一区二区久久久| 亚洲国产视频直播| 国产精品久久久久免费a∨大胸| 久久男女视频| 亚洲一级二级| 在线看欧美日韩| 国产精品福利在线| 嫩草国产精品入口| 亚洲综合精品| 亚洲人成网站在线观看播放| 国产精品视频yy9099| 欧美mv日韩mv亚洲| 欧美一区二区视频观看视频| 亚洲啪啪91| 国产亚洲成年网址在线观看| 欧美精品成人91久久久久久久| 亚洲欧美在线x视频| 91久久黄色| 国产一区二区三区久久 | 久久久精品999| 国产精品99久久久久久白浆小说| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 欧美裸体一区二区三区| 香蕉久久a毛片| 日韩视频一区二区在线观看| 国产主播喷水一区二区| 国产精品porn| 欧美日韩国产在线播放网站| 久久亚洲综合网| 欧美综合二区| 亚洲在线免费观看| 一区二区电影免费在线观看| 亚洲国产成人av| 国产在线高清精品| 国产精品私人影院| 国产精品久久久对白| 欧美日韩国产免费| 欧美激情中文字幕一区二区| 久久天堂成人| 久久亚洲国产精品一区二区| 午夜久久久久久| 亚洲女同精品视频| 亚洲综合色网站| 亚洲自啪免费| 亚洲激情视频网站| 国产精品一级| 国产视频久久| 国产精品婷婷| 国产精品亚洲第一区在线暖暖韩国 | 欧美午夜免费影院| 米奇777超碰欧美日韩亚洲| 久久久久国产精品厨房| 午夜精品久久久久99热蜜桃导演| 先锋资源久久| 免费观看亚洲视频大全| 国产美女扒开尿口久久久| 一本久道久久综合中文字幕| 欧美一站二站| 欧美精品一区二区三区在线看午夜| 国产一区二区三区在线播放免费观看 | 国产一区二区中文| 久久久噜噜噜久噜久久 | 欧美另类专区| 香蕉久久夜色精品国产| 亚洲在线观看视频网站| 亚洲主播在线| 欧美一级大片在线免费观看| 欧美亚洲一区二区在线| 午夜激情综合网| 欧美在线播放高清精品| 久久久999精品| 美乳少妇欧美精品| 欧美激情一区二区三区蜜桃视频| 欧美二区在线| 欧美日韩一区二区三区免费看| 欧美性感一类影片在线播放| 国产精品久久久久国产精品日日| 国产精品人人做人人爽| 国产一区二区黄| 亚洲国产精品久久久久秋霞蜜臀| 亚洲三级观看| 亚洲图片你懂的| 欧美一区二区三区成人| 久久全球大尺度高清视频| 欧美大片在线观看一区二区| 欧美日韩一区二区三区四区在线观看| 欧美午夜精品久久久久久孕妇| 国产精品一二三四区| 狠狠久久综合婷婷不卡| 亚洲日本精品国产第一区| 亚洲综合视频网| 久久网站免费| 欧美视频一区二区三区| 国产一级揄自揄精品视频| 亚洲欧洲精品一区二区三区 | 毛片精品免费在线观看| 欧美区一区二区三区| 国产伦精品一区二区三区高清版| 精品动漫3d一区二区三区| 一本色道久久综合精品竹菊| 久久av红桃一区二区小说| 欧美日本中文字幕| 国产亚洲精品久久飘花| 夜夜夜久久久| 久久婷婷综合激情| 国产精品高清在线| 亚洲黄色三级| 久久九九精品99国产精品| 欧美了一区在线观看| 麻豆freexxxx性91精品| 国产精品黄视频| 最新国产成人在线观看| 亚洲一区二区三区在线视频| 免费成人黄色av| 国产一区二区三区网站|