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

為什么繼承 Python 內置類型會出問題?!

開發 后端
最近我偶然翻到書中一個有點詭異的知識點,因此準備來聊一聊這個話題——子類化內置類型可能會出問題?!

[[352279]]

《流暢的Python》一書值得反復回看,可以溫故知新。最近我偶然翻到書中一個有點詭異的知識點,因此準備來聊一聊這個話題——子類化內置類型可能會出問題?!

 1、內置類型有哪些?

在正式開始之前,我們首先要科普一下:哪些是 Python 的內置類型?

根據官方文檔的分類,內置類型(Built-in Types)主要包含如下內容:

詳細文檔:https://docs.python.org/3/library/stdtypes.html

其中,有大家熟知的數字類型、序列類型、文本類型、映射類型等等,當然還有我們之前介紹過的布爾類型、...對象 等等。

在這么多內容里,本文只關注那些作為可調用對象(callable)的內置類型,也就是跟內置函數(built-in function)在表面上相似的那些:int、str、list、tuple、range、set、dict……

這些類型(type)可以簡單理解成其它語言中的類(class),但是 Python 在此并沒有用習慣上的大駝峰命名法,因此容易讓人產生一些誤解。

在 Python 2.2 之后,這些內置類型可以被子類化(subclassing),也就是可以被繼承(inherit)。

2、內置類型的子類化

眾所周知,對于某個普通對象 x,Python 中求其長度需要用到公共的內置函數 len(x),它不像 Java 之類的面向對象語言,后者的對象一般擁有自己的 x.length() 方法。(PS:關于這兩種設計風格的分析,推薦閱讀 這篇文章)

現在,假設我們要定義一個列表類,希望它擁有自己的 length() 方法,同時保留普通列表該有的所有特性。

實驗性的代碼如下(僅作演示):

  1. # 定義一個list的子類 
  2. class MyList(list): 
  3.     def length(self): 
  4.         return len(self) 

我們令 MyList這個自定義類繼承 list,同時新定義一個 length() 方法。這樣一來,MyList 就擁有 append()、pop() 等等方法,同時還擁有 length() 方法。

  1. # 添加兩個元素 
  2. ss = MyList() 
  3. ss.append("Python"
  4. ss.append("貓"
  5.  
  6. print(ss.length())   # 輸出:2 

前面提到的其它內置類型,也可以這樣作子類化,應該不難理解。

順便發散一下,內置類型的子類化有何好處/使用場景呢?

有一個很直觀的例子,當我們在自定義的類里面,需要頻繁用到一個列表對象時(給它添加/刪除元素、作為一個整體傳遞……),這時候如果我們的類繼承自 list,就可以直接寫 self.append()、self.pop(),或者將 self 作為一個對象傳遞,從而不用額外定義一個列表對象,在寫法上也會簡潔一些。

還有其它的好處/使用場景么?歡迎大家留言討論~~

3、內置類型子類化的“問題”

終于要進入本文的正式主題了:)

通常而言,在我們教科書式的認知中,子類中的方法會覆蓋父類的同名方法,也就是說,子類方法的查找優先級要高于父類方法。

下面看一個例子,父類 Cat,子類 PythonCat,都有一個 say() 方法,作用是說出當前對象的 inner_voice:

  1. # Python貓是一只貓 
  2. class Cat(): 
  3.     def say(self): 
  4.         return self.inner_voice() 
  5.     def inner_voice(self): 
  6.         return "喵" 
  7. class PythonCat(Cat): 
  8.     def inner_voice(self): 
  9.         return "喵喵" 

當我們創建子類 PythonCat 的對象時,它的 say() 方法會優先取到自己定義出的 inner_voice() 方法,而不是 Cat 父類的 inner_voice() 方法:

  1. my_cat = PythonCat() 
  2. # 下面的結果符合預期 
  3. print(my_cat.inner_voice()) # 輸出:喵喵 
  4. print(my_cat.say())         # 輸出:喵喵 

這是編程語言約定俗成的慣例,是一個基本原則,學過面向對象編程基礎的同學都應該知道。

然而,當 Python 在實現繼承時,似乎不完全會按照上述的規則運作。它分為兩種情況:

  • 符合常識:對于用 Python 實現的類,它們會遵循“子類先于父類”的原則
  • 違背常識:對于實際是用 C 實現的類(即str、list、dict等等這些內置類型),在顯式調用子類方法時,會遵循“子類先于父類”的原則;但是,**在存在隱式調用時,**它們似乎會遵循“父類先于子類”的原則,即通常的繼承規則會在此失效

對照 PythonCat 的例子,相當于說,直接調用 my_cat.inner_voice() 時,會得到正確的“喵喵”結果,但是在調用 my_cat.say() 時,則會得到超出預期的“喵”結果。

下面是《流暢的Python》中給出的例子(12.1章節):

  1. class DoppelDict(dict):  
  2.     def __setitem__(self, key, value):  
  3.         super().__setitem__(key, [value] * 2) 
  4.  
  5. dd = DoppelDict(one=1)  # {'one': 1} 
  6. dd['two'] = 2           # {'one': 1, 'two': [2, 2]} 
  7. dd.update(three=3)      # {'three': 3, 'one': 1, 'two': [2, 2]} 

在這個例子中,dd['two'] 會直接調用子類的__setitem__()方法,所以結果符合預期。如果其它測試也符合預期的話,最終結果會是{'three': [3, 3], 'one': [1, 1], 'two': [2, 2]}。

然而,初始化和 update() 直接調用的分別是從父類繼承的__init__()和__update__(),再由它們隱式地調用__setitem__()方法,此時卻并沒有調用子類的方法,而是調用了父類的方法,導致結果超出預期!

官方 Python 這種實現雙重規則的做法,有點違背大家的常識,如果不加以注意,搞不好就容易踩坑。

那么,為什么會出現這種例外的情況呢?

4、內置類型的方法的真面目

我們知道了內置類型不會隱式地調用子類覆蓋的方法,接著,就是Python貓的刨根問底時刻:為什么它不去調用呢?

《流暢的Python》書中沒有繼續追問,不過,我試著胡亂猜測一下(應該能從源碼中得到驗證):內置類型的方法都是用 C 語言實現的,事實上它們彼此之間并不存在著相互調用,所以就不存在調用時的查找優先級問題。

也就是說,前面的“__init__()和__update__()會隱式地調用__setitem__()方法”這種說法并不準確!

這幾個魔術方法其實是相互獨立的!__init__()有自己的 setitem 實現,并不會調用父類的__setitem__(),當然跟子類的__setitem__()就更沒有關系了。

從邏輯上理解,字典的__init__()方法中包含__setitem__()的功能,因此我們以為前者會調用后者,**這是慣性思維的體現,**然而實際的調用關系可能是這樣的:

左側的方法打開語言界面之門進入右側的世界,在那里實現它的所有使命,并不會折返回原始界面查找下一步的指令(即不存在圖中的紅線路徑)。不折返的原因很簡單,即 C 語言間代碼調用效率更高,實現路徑更短,實現過程更簡單。

同理,dict 類型的 get() 方法與__getitem__()也不存在調用關系,如果子類只覆蓋了__getitem__()的話,當子類調用 get() 方法時,實際會使用到父類的 get() 方法。(PS:關于這一點,《流暢的Python》及 PyPy 文檔的描述都不準確,它們誤以為 get() 方法會調用__getitem__())

也就是說,Python 內置類型的方法本身不存在調用關系,盡管它們在底層 C 語言實現時,可能存在公共的邏輯或能被復用的方法。

我想到了“Python為什么”系列曾分析過的《Python 為什么能支持任意的真值判斷?》。在我們寫if xxx時,它似乎會隱式地調用__bool__()和__len__()魔術方法,然而實際上程序依據 POP_JUMP_IF_FALSE 指令,會直接進入純 C 代碼的邏輯,并不存在對這倆魔術方法的調用!

因此,在意識到 C 實現的特殊方法間相互獨立之后,我們再回頭看內置類型的子類化,就會有新的發現:

父類的__init__()魔術方法會打破語言界面實現自己的使命,然而它跟子類的__setitem__()并不存在通路,即圖中紅線路徑不可達。

特殊方法間各行其是,由此,我們會得出跟前文不同的結論:實際上 Python 嚴格遵循了“子類方法先于父類方法”繼承原則,并沒有破壞常識!

最后值得一提的是,__missing__()是一個特例。《流暢的Python》僅僅簡單而含糊地寫了一句,沒有過多展開。

經過初步實驗,我發現當子類定義了此方法時,get() 讀取不存在的 key 時,正常返回 None;但是 __getitem__() 和 dd['xxx'] 讀取不存在的 key 時,都會按子類定義的__missing__()進行處理。

我還沒空深入分析,懇請知道答案的同學給我留言。

5、內置類型子類化的最佳實踐

綜上所述,內置類型子類化時并沒有出問題,只是由于我們沒有認清特殊方法(C 語言實現的方法)的真面目,才會導致結果偏差。

那么,這又召喚出了一個新的問題:如果非要繼承內置類型,最佳的實踐方式是什么呢?

首先,如果在繼承內置類型后,并不重寫(overwrite)它的特殊方法的話,子類化就不會有任何問題。

其次,如果繼承后要重寫特殊方法的話,記得要把所有希望改變的方法都重寫一遍,例如,如果想改變 get() 方法,就要重寫 get() 方法,如果想改變 __getitem__()方法,就要重寫它……

但是,如果我們只是想重寫某種邏輯(即 C 語言的部分),以便所有用到該邏輯的特殊方法都發生改變的話,例如重寫__setitem__()的邏輯,同時令初始化和update()等操作跟著改變,那么該怎么辦呢?

我們已知特殊方法間不存在復用,也就是說單純定義新的__setitem__()是不夠的,那么,怎么才能對多個方法同時產生影響呢?

PyPy 這個非官方的 Python 版本發現了這個問題,它的做法是令內置類型的特殊方法發生調用,建立它們之間的連接通路。

官方 Python 當然也意識到了這么問題,不過它并沒有改變內置類型的特性,而是提供出了新的方案:UserString、UserList、UserDict……

除了名字不一樣,基本可以認為它們等同于內置類型。

這些類的基本邏輯是用 Python 實現的,相當于是把前文 C 語言界面的某些邏輯搬到了 Python 界面,在左側建立起調用鏈,如此一來,就解決了某些特殊方法的復用問題。

對照前文的例子,采用新的繼承方式后,結果就符合預期了:

  1. from collections import UserDict 
  2.  
  3. class DoppelDict(UserDict): 
  4.     def __setitem__(self, key, value):  
  5.         super().__setitem__(key, [value] * 2) 
  6.  
  7. dd = DoppelDict(one=1)  # {'one': [1, 1]} 
  8. dd['two'] = 2           # {'one': [1, 1], 'two': [2, 2]} 
  9. dd.update(three=3)      # {'one': [1, 1], 'two': [2, 2], 'three': [3, 3]} 

顯然,如果要繼承 str/list/dict 的話,最佳的實踐就是繼承collections庫提供的那幾個類。

6、小結

寫了這么多,是時候作 ending 了~~

在本系列的前一篇文章中,Python貓從查找順序與運行速度兩方面,分析了“為什么內置函數/內置類型不是萬能的”,本文跟它一脈相承,也是揭示了內置類型的某種神秘的看似是缺陷的行為特征。

本文雖然是從《流暢的Python》書中獲得的靈感,然而在語言表象之外,我們還多追問了一個“為什么”,從而更進一步地分析出了現象背后的原理。

簡而言之,內置類型的特殊方法是由 C 語言獨立實現的,它們在 Python 語言界面中不存在調用關系,因此在內置類型子類化時,被重寫的特殊方法只會影響該方法本身,不會影響其它特殊方法的效果。

如果我們對特殊方法間的關系有錯誤的認知,就可能會認為 Python 破壞了“子類方法先于父類方法”的基本繼承原則。(很遺憾《流暢的Python》和 PyPy 都有此錯誤的認知)

為了迎合大家對內置類型的普遍預期,Python 在標準庫中提供了 UserString、UserList、UserDict 這些擴展類,方便程序員來繼承這些基本的數據類型。

本文轉載自微信公眾號「Python貓」,可以通過以下二維碼關注。轉載本文請聯系Python貓公眾號。

 

責任編輯:武曉燕 來源: Python貓
相關推薦

2021-12-20 14:02:21

云計算公有云工具

2024-01-31 10:11:41

Redis內存

2011-05-17 08:58:29

軟件項目經理

2020-09-29 15:24:07

面試數據結構Hashmap

2021-03-02 06:02:03

Kafka高并發系統

2023-05-15 08:34:36

css浮動

2022-06-13 10:07:13

物聯網開發物聯網

2021-08-27 00:02:02

JavaStream流操作

2012-08-07 09:37:23

虛擬化

2022-05-05 08:00:00

團隊敏捷流程

2012-05-16 13:43:20

操作系統故障檢修系統管理

2020-10-18 12:36:06

Python開發函數

2020-03-27 10:08:10

JS異步 I

2021-12-09 10:51:47

Go繼承

2022-12-26 00:00:03

非繼承關系JDK

2011-05-25 18:31:45

2010-02-02 13:32:32

Python繼承

2011-06-29 16:21:49

和信創天終端管理虛擬終端管理系統

2019-12-18 14:58:37

智能家居物聯網技術

2021-03-06 10:25:19

內存Java代碼
點贊
收藏

51CTO技術棧公眾號

亚洲国产成人高清精品| 成人av在线网| 另类视频在线观看| www.男人天堂| 韩日精品一区| 樱桃视频在线观看一区| 精品国产一区二区三区日日嗨 | 色综合久久五月| 色婷婷综合久久久中字幕精品久久| 中文字幕乱码久久午夜不卡| 亚洲综合一区二区不卡| 国产亚洲欧美在线精品| 中文字幕午夜精品一区二区三区| 国产视频久久久久久久| 污版视频在线观看| h片在线观看视频免费| 中文字幕一区av| 久久久久久高清| a级片在线播放| 日韩成人免费在线| 久久久久久久影院| 污污视频网站在线免费观看| 精品素人av| 欧美精品123区| 成人在线观看黄| 黄色影院在线看| 亚洲欧洲99久久| 日本一区美女| 天堂资源中文在线| 国产成人午夜电影网| 国产精品旅馆在线| 国产三级av片| 亚洲视频福利| 欧美成人精品一区二区| 国产小视频你懂的| 国产一区二区三区天码| 欧美岛国在线观看| 日韩av自拍偷拍| 最新日韩一区| 91国内精品野花午夜精品| 国产av人人夜夜澡人人爽麻豆| 老司机精品影院| 国产精品视频一二三| 久久精品magnetxturnbtih| 亚洲国产成人一区二区| 国产精品一区二区久久不卡| 国产精品自在线| 国产无遮挡又黄又爽又色视频| 国产日韩1区| 68精品久久久久久欧美| 国产无套内射又大又猛又粗又爽| 欧美freesex交免费视频| 久久精品99国产精品酒店日本| 日韩免费成人av| 欧美美女视频| 中文字幕亚洲字幕| 2014亚洲天堂| 亚洲最大av| 欧美第一页在线| 麻豆影视在线播放| 尤物精品在线| 2019亚洲男人天堂| 四虎成人在线观看| 日韩av中文在线观看| 国产精品福利在线观看| 中文人妻熟女乱又乱精品| 免费在线观看不卡| 国产精品亚洲第一区| 亚洲天堂aaa| 国产精品自拍av| 99视频免费观看| 无码国产精品96久久久久| 91视频一区二区三区| 欧美日韩国产综合在线| www.在线视频.com| 亚洲你懂的在线视频| 欧美一级爱爱视频| 绿色成人影院| 欧美亚洲精品一区| 中文字幕55页| 精品伊人久久久| 国产一区二区三区在线观看视频| av在线播放中文字幕| 亚洲情侣在线| 97视频国产在线| 亚洲中文字幕无码爆乳av| 久久精品国产一区二区三| 666精品在线| 台湾av在线二三区观看| 国产精品视频你懂的| 69精品丰满人妻无码视频a片| 国产精品蜜芽在线观看| 欧美性xxxxxx少妇| 熟妇高潮一区二区| 成人免费a**址| 欧美高清一级大片| 中文字幕第315页| 国产成人精品免费视频网站| 欧美中文娱乐网| 自拍亚洲图区| 色综合一区二区| 欧美日韩一区二区区别是什么| 欧美巨大xxxx| 久久久精品在线观看| 国产精品久久久久久久妇| 蜜臀av性久久久久蜜臀aⅴ流畅| 99久久无色码| 免费高清在线观看| 狠狠色狠狠色综合日日五| 一区二区久久精品| 国产伦精品一区二区三区视频| 久久综合九色九九| 中文字幕天堂在线| av电影天堂一区二区在线| 一区二区精品国产| 亚洲www免费| 亚洲精品国产精品国自产在线| 日韩av毛片在线观看| 久久久久久久欧美精品| 国产欧美韩日| bestiality新另类大全| 欧美系列日韩一区| 成人免费网站黄| 国产日韩欧美三区| 国产传媒一区| 超碰在线最新| 欧美久久高跟鞋激| 91在线无精精品白丝| 国产精品久久久久久久久久妞妞| 亚洲自拍av在线| 免费大片在线观看www| 在线观看一区二区视频| av网站免费在线播放| 亚洲国产导航| 国产a一区二区| av黄在线观看| 欧美一区二区在线免费播放| 国产午夜精品久久久久久久久| 亚洲欧美日韩专区| 久久久久网址| 周于希免费高清在线观看| 精品久久久久久综合日本欧美| 日韩欧美123区| 极品美女销魂一区二区三区| 日韩国产精品一区二区| 激情亚洲影院在线观看| 亚洲欧美www| 国产99免费视频| 久久久久国产精品麻豆ai换脸| 国产成人无码精品久久久性色| 国产精品白浆| 羞羞色国产精品| 亚洲精品一区二区口爆| 亚洲大片免费看| 狠狠人妻久久久久久综合蜜桃| 在线亚洲观看| 欧美日韩高清在线一区| av一区在线| 中文字幕亚洲欧美| 国产精品人妻一区二区三区| 一区二区中文字幕在线| 四川一级毛毛片| 国产精品www.| 久久精品综合一区| 蜜桃视频成人m3u8| 中文字幕日韩av电影| 97精品人妻一区二区三区在线| 亚洲视频1区2区| 亚洲精品鲁一鲁一区二区三区| 欧美色一级片| 久久久久无码国产精品一区| 搜成人激情视频| 自拍视频国产精品| 精品人妻少妇AV无码专区| 性久久久久久久| 免费看黄色的视频| 黑人巨大精品欧美一区| 成人在线国产视频| 九九热爱视频精品视频| 国产日韩在线看| 日韩精品卡一| 亚洲欧美日韩高清| 国产尤物视频在线观看| 亚洲一区二区三区美女| 制服 丝袜 综合 日韩 欧美| 激情久久久久久久久久久久久久久久| 久久久99精品视频| 一区二区美女| 成人做爽爽免费视频| rebdb初裸写真在线观看| 中文国产成人精品久久一| 亚洲高清精品视频| 91国偷自产一区二区开放时间| 91porn在线视频| 久久综合色播五月| 免费看三级黄色片| 久热综合在线亚洲精品| 欧美 日韩 国产精品| 国产成人高清| 国产成人成网站在线播放青青| 香蕉成人影院| 97avcom| 国产精品久久久久久福利| 日韩h在线观看| 99草在线视频| 91成人免费在线视频| 久久久久久久久久久久久久免费看 | 91免费综合在线| 中国色在线日|韩| 九九热这里只有精品6| 国产三级电影在线观看| 亚洲精品在线免费观看视频| 国产精品无码一区| 懂色av影视一区二区三区| 久久中文免费视频| 国产精品欧美经典| 亚洲AV无码片久久精品| 成人黄色小视频在线观看| 亚洲天堂网2018| 日韩高清欧美激情| 丰满人妻中伦妇伦精品app| 国产精品chinese| 中文字幕免费高| 日韩极品一区| 日韩精品大片| 曰本一区二区三区视频| 国外成人在线视频网站| 亚洲专区**| 91久久久久久久| 日韩美香港a一级毛片| 国产精品扒开腿做爽爽爽视频| 麻豆视频在线看| 午夜精品久久久久久久99黑人 | 精品动漫一区二区三区| 亚洲国产精品免费在线观看| 国产精品久久一级| 日韩女同一区二区三区| 国产情人综合久久777777| 在线观看国产网站| 91小视频在线观看| 欧美精品黑人猛交高潮| 91在线视频在线| 亚洲av成人无码一二三在线观看| 国产超碰在线一区| 成人做爰www看视频软件| 国产精品18久久久久久vr| 中文字幕第22页| 国产成人在线观看免费网站| 永久看看免费大片| 国产黑丝在线一区二区三区| 日本中文字幕精品—区二区| 蜜桃av噜噜一区二区三区小说| 污版视频在线观看| 韩日欧美一区二区三区| 少妇献身老头系列| 成人动漫一区二区三区| 久久偷拍免费视频| 久久蜜桃av一区二区天堂| 男人操女人动态图| 国产精品毛片大码女人| 草视频在线观看| 亚洲电影一区二区| 国产又大又黄视频| 欧美中文字幕一区二区三区亚洲| 一区二区三区精| 欧美一级免费大片| 天堂网在线中文| 亚洲日本成人网| 免费高清完整在线观看| 欧美激情亚洲另类| 欧美日韩国产观看视频| 国产精品久久久| 日本一区二区乱| 欧美高清性xxxxhd| 日本一本不卡| 国产又粗又大又爽的视频| av成人天堂| www.夜夜爽| 成人美女视频在线观看| 西西444www无码大胆| 17c精品麻豆一区二区免费| 国产午夜福利片| 欧美性受xxxx| 亚洲风情第一页| 国产一区二区日韩| 在线观看免费视频你懂的| 97久久伊人激情网| 日韩在线电影| 久久99国产精品| 91精品啪在线观看国产81旧版| 黄色大片中文字幕| 免费不卡在线视频| 人妻换人妻a片爽麻豆| 国产三级欧美三级| 国内偷拍精品视频| 欧美在线|欧美| 黄色片一区二区三区| 国产一区二区三区欧美| 大桥未久在线播放| 成人福利免费观看| 亚洲精品亚洲人成在线观看| 国产美女视频免费| 玖玖视频精品| 丰满少妇xbxb毛片日本| 国产精品进线69影院| 国产免费观看av| 欧美一二三四在线| 一级日本在线| 欧美一区第一页| 国产毛片久久久| 中国 免费 av| 免费成人在线观看| 亚洲精品成人无码熟妇在线| 一级做a爱片久久| 国产一区二区三区中文字幕| 亚洲人成五月天| 白浆在线视频| 国产精品theporn88| 国产一区二区在线| 女性女同性aⅴ免费观女性恋| 国产一区二区福利视频| 手机看片福利视频| 色综合天天做天天爱| 天天摸天天干天天操| 欧美日韩国产成人在线观看| 99久久婷婷国产综合精品首页| 久久精品午夜一区二区福利| 黄色成人av网站| 色哟哟免费视频| 亚洲欧美日韩小说| 国产精品主播一区二区| 色偷偷亚洲男人天堂| 国产成人精品一区二区三区视频 | 91福利小视频| 男人的天堂在线| 国产91成人video| 丝袜美腿综合| 黄色动漫在线免费看| www.欧美日韩| 中国一级免费毛片| 精品亚洲aⅴ在线观看| 神马久久午夜| 久久精品二区| 美女诱惑一区| 在线观看日本中文字幕| 欧美色播在线播放| 青青青草网站免费视频在线观看| 2018日韩中文字幕| 性人久久久久| 日韩av一二三四| 日本一区二区视频在线观看| 伊人久久中文字幕| 日韩在线观看成人| 精品精品视频| 精品一二三四五区| 99久久国产综合精品麻豆| 九九热在线视频播放| 亚洲少妇中文在线| 农村妇女一区二区| 青青草原网站在线观看| 国产成人精品午夜视频免费| 久久久精品国产sm调教网站| 亚洲国产精品成人精品| 亚洲黄色中文字幕| 亚洲国产欧洲综合997久久| 久久国产精品99精品国产| 中文字幕在线观看成人| 日韩hd视频在线观看| 粉嫩91精品久久久久久久99蜜桃| 自拍亚洲欧美老师丝袜| 国产精品66部| 亚洲黄网在线观看| 日韩有码视频在线| 9国产精品午夜| 国产精品亚洲αv天堂无码| 中文字幕av免费专区久久| 国产免费不卡av| 97av在线视频| 99久久99久久精品国产片果冰| 国产chinesehd精品露脸| 日韩欧美亚洲国产一区| 日本网站在线免费观看视频| 不卡一卡2卡3卡4卡精品在| 久久黄色影院| 精品爆乳一区二区三区无码av| 亚洲精品狠狠操| 欧美国产视频| 91专区在线观看| 成人欧美一区二区三区白人| 亚洲国产欧美另类| 国产国语videosex另类| 欧美在线免费| www在线观看免费视频| 欧美一区二区免费视频| 亚洲十八**毛片| 美女黄色片网站| 国产亚洲精品bt天堂精选| 亚洲av少妇一区二区在线观看| 国产99视频在线观看| 欧美日韩精品|