亚洲免费不卡_在线视频精品_国产尤物精品_久久久久网址_久久精品91_欧美va天堂在线_狠狠入ady亚洲精品_亚洲午夜精品福利_国产精品草草_午夜精品久久99蜜桃的功能介绍

Python中的Classes和Metaclasses詳解
來源:易賢網 閱讀:1672 次 日期:2015-04-20 10:38:36
溫馨提示:易賢網小編為您整理了“Python中的Classes和Metaclasses詳解”,方便廣大網友查閱!

類和對象

類和函數一樣都是Python中的對象。當一個類定義完成之后,Python將創建一個“類對象”并將其賦值給一個同名變量。類是type類型的對象(是不是有點拗口?)。

類對象是可調用的(callable,實現了 __call__方法),并且調用它能夠創建類的對象。你可以將類當做其他對象那么處理。例如,你能夠給它們的屬性賦值,你能夠將它們賦值給一個變量,你可以在任何可調用對象能夠用的地方使用它們,比如在一個map中。事實上當你在使用map(str, [1,2,3])的時候,是將一個整數類型的list轉換為字符串類型的list,因為str是一個類。可以看看下面的代碼:

>>> 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”關鍵字不像其他語言(例如C++)那樣必須出現在代碼main scope中。在Python中,它能夠在一個函數中嵌套出現,舉個例子,我們能夠這樣在函數運行的過程中動態的創建類。看代碼:

>>> 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>,)

請注意,在這里通過make_class創建的兩個類是不同的對象,因此通過它們創建的對象就不屬于同一個類型。正如我們在裝飾器中做的那樣,我們在類被創建之后手動設置了類名。同樣也請注意所創建類的print_class_name方法在一個closure cell中捕捉到了類的closure和class_name。如果你對closure的概念還不是很清楚,那么最好去看看前篇,復習一下closures和decorators相關的內容。

Metaclasses

如果類是能夠制造對象的對象,那制造類的對象又該叫做什么呢(相信我,這并不是一個先有雞還是先有蛋的問題)?答案是元類(Metaclasses)。大部分常見的基礎元類都是type。當輸入一個參數時,type將簡單的返回輸入對象的類型,這就不涉及元類。然而當輸入三個參數時,type將扮演元類的角色,基于輸入參數創建一個類并返回。輸入參數相當簡單:類名,父類及其參數的字典。后面兩者可以為空,來看一個例子:

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

>>> type(MyClass)

<type 'type'>

>>> o = MyClass()

>>> o.my_attribute

0

特別注意第二個參數是一個tuple(語法看起來很奇怪,以逗號結尾)。如果你需要在類中安排一個方法,那么創建一個函數并且將其以屬性的方式傳遞作為第三個參數,像這樣:

>>> 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>>

我們可以通過一個可調用對象(函數或是類)來自定義元類,這個對象需要三個輸入參數并返回一個對象。這樣一個元類在一個類上實現只要定義了它的__metaclass__屬性。第一個例子,讓我們做一些有趣的事情看看我們能夠用元類做些什么:

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

... return "Hello"

...

>>> class C(object):

... __metaclass__ = mymetaclass

...

>>> print C

Hello

>>> type(C)

<type 'str'>

請注意以上的代碼,C只是簡單地將一個變量引用指向了字符串“Hello”。當然了,沒人會在實際中寫這樣的代碼,這只是為了演示元類的用法而舉的一個簡單例子。接下來我們來做一些更有用的操作。在本系列的第二部分我們曾看到如何使用裝飾器類來記錄目標類每個方法的輸出,現在我們來做同樣的事情,不過這一次我們使用元類。我們借用之前的裝飾器定義:

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

如你所見,類裝飾器與元類有著很多共同點。事實上,任何能夠用類裝飾器完成的功能都能夠用元類來實現。類裝飾器有著很簡單的語法結構易于閱讀,所以提倡使用。但就元類而言,它能夠做的更多,因為它在類被創建之前就運行了,而類裝飾器則是在類創建之后才運行的。記住這點,讓我們來同時運行一下兩者,請注意運行的先后順序:

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.

元類的一個實際用例

讓我們來考慮一個更有用的實例。假設我們正在構思一個類集合來處理MP3音樂文件中使用到的ID3v2標簽Wikipedia。簡而言之,標簽由幀(frames)組成,而每幀通過一個四字符的識別碼(identifier)進行標記。舉個例子,TOPE標識了原作者幀,TOAL標識了原專輯名稱等。如果我們希望為每個幀類型寫一個單獨的類,并且允許ID3v2標簽庫用戶自定義他們自己的幀類。那么我們可以使用元類來實現一個類工廠模式,具體實現方式可以這樣:

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'>

當然了,以上的代碼同樣可以用類裝飾器來完成,以下是對應代碼:

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'>

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

>>> 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!'

通過type生成元類

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

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

>>> 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'>

請注意當類創建對象時,元類的__call__函數就被調用,進而調用type.__call__創建對象。在下一節,我們將把上面的內容融合在一起。

要點集合

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

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

現在,你可以花幾分鐘時間測試一下你的理解,并且猜一猜打印輸出的順序。

首先,讓我們來看看Python的解釋器是如何閱讀這部分代碼的,然后我們會對應輸出來加深我們的理解。

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

2. Python會檢查__metaclass__屬性,如果設置了此屬性,它將調用metaclass,傳遞三個參數,并且返回一個類。

3. 在這個例子中,metaclass自身就是一個類,所以調用它的過程類似創建一個新類。這就意味著my_metaclass.__new__將首先被調用,輸入四個參數,這將新建一個metaclass類的實例。然后這個實例的my_metaclass.__init__將被調用調用結果是作為一個新的類對象返回。所以此時C將被設置成這個類對象。

4. 接下來Python將查看所有裝飾了此類的裝飾器。在這個例子中,只有一個裝飾器。Python將調用這個裝飾器,將從元類哪里得到的類傳遞給它作為參數。然后這個類將被裝飾器返回的對象所替代。

5. 裝飾器返回的類類型與元類設置的相同。

6. 當類被調用創建一個新的對象實例時,因為類的類型是metaclass,因此Python將會調用元類的__call__方法。在這個例子中,my_metaclass.__call__只是簡單的調用了type.__call__,目的是創建一個傳遞給它的類的對象實例。

7. 下一步type.__call__通過C.__new__創建一個對象。

8. 最后type.__call__通過C.__new__返回的結果運行C.__init__。

9. 返回的對象已經準備完畢。

所以基于以上的分析,我們可以看到調用的順序如下:my_metaclass.__new__首先被調用,然后是my_metaclass.__init__,然后是my_class_decorator。至此C類已經準備完畢(返回結果就是C)。當我們調用C來創建一個對象的時候,首先會調用my_metaclass.__call__(任何對象被創建的時候,Python都首先會去調用其類的__call__方法),然后C.__new__將會被type.__call__調用(my_metaclass.__call__簡單調用了type.__call__),最后是C.__init__被調用。現在讓我們來看看輸出:

- 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'>

關于元類多說幾句

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

ABCMeta是一個允許注冊抽象基類的元類。如果想了解多些請查看其官方文檔,本文將不會討論它。

對于djangoplugins而言,基本的思想是基于這篇文章article on a simple plugin framework for Python,使用元類是為了創建一個插件掛載系統。我并沒有對其有深入的研究,不過我感覺這個功能可以使用裝飾器來實現。如果你有相關的想法請在 本文后留言。

總結筆記

通過理解元類能夠幫助我們更深入的理解Python中類和對象的行為,現實中使用它們的情況可能比文中的例子要復雜得多。大部分元類完成的功能都可以使用裝飾器來實現。所以當你的第一直覺是使用元類來解決你的問題,那么請你停下來先想想這是否必要。如果不是非要使用元類,那么請三思而行。這會使你的代碼更易懂,更易調試和維護。

更多信息請查看IT技術專欄

更多信息請查看技術文章
易賢網手機網站地址:Python中的Classes和Metaclasses詳解
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點

版權所有:易賢網

亚洲免费不卡_在线视频精品_国产尤物精品_久久久久网址_久久精品91_欧美va天堂在线_狠狠入ady亚洲精品_亚洲午夜精品福利_国产精品草草_午夜精品久久99蜜桃的功能介绍
久久午夜精品一区二区| 国产亚洲在线| 亚洲美女视频在线免费观看| 亚洲二区精品| 国产美女诱惑一区二区| 国产精品一区毛片| 你懂的国产精品| 亚洲成色精品| 鲁大师影院一区二区三区| 欧美成人一品| 亚洲精品一区二| 亚洲欧美日韩在线观看a三区| 你懂的亚洲视频| 宅男噜噜噜66国产日韩在线观看| 久久久精品午夜少妇| 国产精品mm| 亚洲欧美日本国产专区一区| 国产精品videosex极品| 宅男噜噜噜66国产日韩在线观看| 欧美高清视频一区| 黄色日韩在线| 美日韩精品免费| 亚洲三级色网| 国产精品mm| 久久亚洲不卡| 亚洲一区二区三区精品视频| 一区福利视频| 欧美日韩 国产精品| 性欧美videos另类喷潮| 亚洲二区精品| 狠狠色综合网| 在线观看成人av| 午夜视频精品| 久久久噜噜噜| 国产伦理一区| 国产一区二区黄色| 99精品免费| 好吊视频一区二区三区四区| 久久一区二区三区超碰国产精品| 国产亚洲一级| 国产一区二区三区成人欧美日韩在线观看| 欧美三级视频| 欧美精品一区二区视频| 免费日韩av片| 国产一区二区三区高清| av成人免费观看| 99精品99| 国产精品亚洲综合色区韩国| 伊人久久婷婷| 亚洲人体大胆视频| av成人激情| 国产精品入口| 国产精品一区二区三区免费观看| 99国产精品99久久久久久粉嫩| 亚洲一级电影| 亚洲精品欧美精品| 国产精品综合色区在线观看| 国产伦一区二区三区色一情| 国产伦精品一区二区三| 亚洲综合精品四区| 久久三级视频| 国产一区二区三区四区三区四| 欧美精品偷拍| 亚洲日本视频| 美女尤物久久精品| 欧美精品一卡| 亚洲美女黄色| 欧美日本国产精品| 影音欧美亚洲| 国产精品制服诱惑| 欧美高清日韩| 亚洲成人在线| 蜜桃精品久久久久久久免费影院| 欧美69wwwcom| 亚洲精品色图| 久久一区免费| 亚洲毛片一区| 欧美理论在线| 亚洲一区观看| 国内一区二区三区| 亚洲一区图片| 亚洲视频精品| 久久福利毛片| 亚洲国产清纯| 欧美精品一卡| 香蕉成人久久| 亚洲人久久久| 黄色日韩在线| 国产亚洲综合精品| 午夜精品一区二区三区四区| 精品动漫av| 久久久福利视频| 亚洲国产日韩在线| 欧美啪啪一区| 国产精品乱码一区二区三区| 欧美特黄一区| 乱码第一页成人| 中日韩男男gay无套| 午夜久久资源| 免费亚洲一区二区| 夜久久久久久| 影音国产精品| 国内精品久久久久久久影视蜜臀| 麻豆av一区二区三区| 中文精品视频| 亚洲欧洲一区| 亚洲国产电影| 在线精品一区二区| 欧美视频在线观看| 国产精品国产一区二区| 欧美精品一卡| 欧美网站在线| 国产精品jizz在线观看美国| 欧美国产91| 国产精品mm| 影音先锋国产精品| 1024日韩| 亚洲麻豆一区| 国产精品免费在线| 销魂美女一区二区三区视频在线| 国产欧美不卡| 午夜一区二区三区不卡视频| 亚洲欧美日本国产专区一区| 国产伦精品一区| 久久精品国产综合精品| 久久久www| 欧美日韩一区二区三| 欧美视频在线观看| 在线不卡欧美| aⅴ色国产欧美| 亚洲欧美清纯在线制服| 欧美1区2区视频| 999亚洲国产精| 最新成人av网站| 日韩午夜免费视频| 亚洲精品一二| 最新国产乱人伦偷精品免费网站| 在线观看福利一区| 欧美私人啪啪vps| 欧美日韩影院| 欧美二区在线| 欧美精品二区| 91久久国产综合久久蜜月精品| 欧美日韩亚洲一区二区三区在线观看 | 日韩视频中文| 极品少妇一区二区三区| 韩国av一区| 国内久久精品| 激情欧美日韩一区| 久久精品国产99精品国产亚洲性色| 亚洲每日在线| 中文精品视频| 久久av一区二区三区亚洲| 久久黄色影院| 国内精品久久久久久久影视麻豆| 亚洲午夜91| 免费日韩av片| 欧美日韩mv| 亚洲第一黄网| 免费久久99精品国产自在现线| 久久久久成人精品免费播放动漫| 国产亚洲一级| 一区在线视频| 国产亚洲欧美另类一区二区三区| 在线亚洲国产精品网站| 亚洲欧美日韩一区在线观看| 欧美在线网址| 亚洲国产专区| 亚洲亚洲精品三区日韩精品在线视频| 91久久极品少妇xxxxⅹ软件| 欧美激情自拍| 国产精品一级| 欧美一区免费视频| 亚洲高清资源| 红桃视频国产精品| 亚洲一区二区三区精品动漫| 久久一区视频| 亚洲精品国产精品国自产观看| 国产欧美日韩综合精品二区| 久久福利一区| 国精品一区二区三区| 亚洲精品视频一区二区三区 | 亚洲一区亚洲| 国产综合色一区二区三区| 久久久www| a91a精品视频在线观看| 欧美淫片网站| 亚洲综合99| 99精品国产在热久久婷婷| 欧美精品播放| 国内自拍视频一区二区三区| 亚洲一区在线免费| 亚洲经典在线看| 欧美午夜免费| 久久久国产亚洲精品| 99av国产精品欲麻豆| 在线观看一区视频| 国产精品chinese| 欧美 日韩 国产一区二区在线视频 | 一级成人国产| 亚洲二区免费| 国内精品亚洲| 国产综合精品一区| 午夜日韩电影| 欧美日韩视频在线一区二区观看视频| 欧美二区在线| 欧美一区二区| 欧美一区二区三区四区在线观看地址| 国产欧美另类| 一本色道久久综合亚洲精品不 | 黑人一区二区三区四区五区| 毛片一区二区| 欧美一级专区| 免费欧美在线| 国产精品五区| 欧美日韩一区二区三区在线观看免 | 在线欧美一区| 国产深夜精品| 日韩午夜一区| 国产美女诱惑一区二区| 国产伦精品一区二区三区视频孕妇| 在线日韩中文| 国产综合第一页| 国产日韩欧美综合精品| 一区二区福利| 国产精品综合色区在线观看| 99在线观看免费视频精品观看| 亚洲精品美女91| 亚洲香蕉网站| 久久大逼视频| 欧美成熟视频| 狠狠综合久久| 最近看过的日韩成人| 99亚洲精品| 国产精品豆花视频| 樱桃成人精品视频在线播放| 在线精品亚洲| 国产伦精品一区| 欧美在线免费| 欧美日韩免费高清| 久久国产日韩欧美| 欧美天天在线| 亚洲精品偷拍| 久久久蜜桃一区二区人| 欧美片第1页综合| 亚洲一区三区电影在线观看| 久久男女视频| 国内精品久久久久国产盗摄免费观看完整版| 在线观看视频免费一区二区三区| 亚洲精品一区二区三| 午夜一区不卡| 日韩视频在线播放| 性欧美xxxx大乳国产app| 欧美激情第8页| 一区二区91| 欧美日韩理论| 欧美日韩国产色综合一二三四| 亚洲免费成人| 欧美涩涩视频| 久久国产精品亚洲va麻豆| 亚洲视频狠狠| 欧美.日韩.国产.一区.二区| 欧美日韩在线大尺度| 国产精品亚洲不卡a| 好吊视频一区二区三区四区| 亚洲在线不卡| 亚洲男人影院| 日韩午夜av| 国内精品一区二区| 欧美国产三区| 久久久久se| 午夜日韩在线| 久久深夜福利| 免费看的黄色欧美网站| 亚洲精品欧洲精品| 黄色成人在线网站| 伊人久久婷婷| 国内一区二区三区在线视频| 久久综合亚州| 久久精品国产清高在天天线| 黄色成人精品网站| 亚洲国产第一| 在线欧美福利| 亚洲电影av| 在线看片一区| 欧美日韩三区四区| 亚洲精品一二| 亚洲区第一页| 亚洲精品黄色| 中国成人亚色综合网站| 久久精品一本| 久久久久久穴| 欧美一区高清| 欧美精品七区| 欧美日韩精品一区| 日韩视频在线一区二区三区| 雨宫琴音一区二区在线| 国语自产精品视频在线看8查询8| 巨乳诱惑日韩免费av| 亚洲精品无人区| av成人黄色| 一本一本久久a久久精品综合妖精| 禁久久精品乱码| 亚洲承认在线| 国产日韩欧美一区在线 | 国产日韩1区| 国产精品一区二区欧美| 欧美主播一区二区三区美女 久久精品人| 在线亚洲成人| 亚洲国产精品一区在线观看不卡 | 国精品一区二区三区| 激情成人亚洲| 99国产精品视频免费观看一公开| 99亚洲伊人久久精品影院红桃| 国产欧美亚洲日本| 欧美亚洲一区二区三区| 欧美91福利在线观看| 久久午夜精品| 国产欧美二区| 欧美日韩岛国| 一本色道久久综合亚洲精品不卡| 国产精品亚洲综合| 免播放器亚洲| 久久亚洲欧洲| 国产亚洲一区在线| 欧美日韩大片一区二区三区| 亚洲精品男同| 麻豆av一区二区三区| 欧美日韩在线精品一区二区三区| 影音先锋久久久| 久久精品日产第一区二区| 国产精品草草| 鲁大师成人一区二区三区| 国产欧美午夜| 欧美性色综合| 亚洲一区日韩在线| 在线精品观看| 欧美激情一区二区三区在线视频| 一区二区三区久久网| 国产一区二区三区奇米久涩| 亚洲欧美综合| 国内视频精品| 好吊日精品视频| 久久精品九九| 一区二区三区三区在线| 国产主播精品| 一区视频在线看| 欧美777四色影| 亚洲一区在线免费| 亚洲黄色成人| 国产精品初高中精品久久| 亚洲欧美日韩在线观看a三区| 国内精品久久久久久久97牛牛| 久久99伊人| 国产精品久久久免费| 国产精品一区二区三区免费观看 | 中文日韩欧美| 欧美日一区二区在线观看| 欧美日韩在线高清| 久久一区免费| 免播放器亚洲| 性欧美暴力猛交另类hd| 欧美一区二区在线| 久久精品二区| 欧美1区3d| 欧美在线国产| 国产亚洲精品v| 久久福利精品| 久久国产精品亚洲77777| 一区二区三区福利| 亚洲视频播放| 久久综合伊人77777麻豆| 免费中文字幕日韩欧美| 亚洲欧美日韩国产一区二区| 国产一区二区黄色| 午夜一区二区三视频在线观看| 国产欧美在线| 国产美女诱惑一区二区| 伊甸园精品99久久久久久| 亚洲精品偷拍| 亚洲在线观看| 久久激情网站| 欧美日韩三区四区| 一区二区日韩免费看| 国产精品主播| 久久精品国产第一区二区三区最新章节 | 国产精品亚洲综合色区韩国| 国产精品欧美久久| 久久久久久九九九九| 国产精品二区三区四区| 亚洲综合社区| 欧美欧美天天天天操| 激情欧美日韩一区| 美女精品网站| 亚洲网站视频| 亚洲综合日本| 国产综合网站| 欧美 日韩 国产精品免费观看| 狠狠88综合久久久久综合网| 亚洲全部视频|