最新文章專(zhuān)題視頻專(zhuān)題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專(zhuān)題1關(guān)鍵字專(zhuān)題50關(guān)鍵字專(zhuān)題500關(guān)鍵字專(zhuān)題1500TAG最新視頻文章視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專(zhuān)題關(guān)鍵字專(zhuān)題tag2tag3文章專(zhuān)題文章專(zhuān)題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專(zhuān)題3
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

用Python創(chuàng)建聲明性迷你語(yǔ)言的教程

來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 14:39:50
文檔

用Python創(chuàng)建聲明性迷你語(yǔ)言的教程

用Python創(chuàng)建聲明性迷你語(yǔ)言的教程:大多數(shù)程序員考慮編程時(shí),他們都要設(shè)想用于編寫(xiě)應(yīng)用程序的 命令式樣式和技術(shù)。最受歡迎的通用編程語(yǔ)言(包括 Python 和其它面向?qū)ο蟮恼Z(yǔ)言)在樣式上絕大多數(shù)都是命令式的。另一方面,也有許多編程語(yǔ)言是 聲明性樣式,包括函數(shù)語(yǔ)言和邏輯語(yǔ)言,還包括通用語(yǔ)言
推薦度:
導(dǎo)讀用Python創(chuàng)建聲明性迷你語(yǔ)言的教程:大多數(shù)程序員考慮編程時(shí),他們都要設(shè)想用于編寫(xiě)應(yīng)用程序的 命令式樣式和技術(shù)。最受歡迎的通用編程語(yǔ)言(包括 Python 和其它面向?qū)ο蟮恼Z(yǔ)言)在樣式上絕大多數(shù)都是命令式的。另一方面,也有許多編程語(yǔ)言是 聲明性樣式,包括函數(shù)語(yǔ)言和邏輯語(yǔ)言,還包括通用語(yǔ)言

大多數(shù)程序員考慮編程時(shí),他們都要設(shè)想用于編寫(xiě)應(yīng)用程序的 命令式樣式和技術(shù)。最受歡迎的通用編程語(yǔ)言(包括 Python 和其它面向?qū)ο蟮恼Z(yǔ)言)在樣式上絕大多數(shù)都是命令式的。另一方面,也有許多編程語(yǔ)言是 聲明性樣式,包括函數(shù)語(yǔ)言和邏輯語(yǔ)言,還包括通用語(yǔ)言和專(zhuān)用語(yǔ)言。

讓我們列出幾個(gè)屬于各個(gè)種類(lèi)的語(yǔ)言。許多讀者已經(jīng)使用過(guò)這些工具中的許多工具,但不見(jiàn)得考慮過(guò)它們之間的種類(lèi)差別。Python、C、C++、Java、Perl、Ruby、Smalltalk、Fortran、Basic 和 xBase 都是簡(jiǎn)單的命令式編程語(yǔ)言。其中,一些是面向?qū)ο蟮?,但那只是組織代碼和數(shù)據(jù)的問(wèn)題,而非基本編程樣式的問(wèn)題。使用這些語(yǔ)言,您 命令程序執(zhí)行指令序列:把某些數(shù)據(jù) 放入(put)變量中;從變量中 獲?。╢etch)數(shù)據(jù); 循環(huán)(loop)一個(gè)指令塊 直到(until)滿足了某些條件; 如果(if)某個(gè)命題為 true,那么就進(jìn)行某些操作。所有這些語(yǔ)言的一個(gè)妙處在于:便于用日常生活中熟悉的比喻來(lái)考慮它們。日常生活都是由做事、選擇、再做另一件事所組成的,期間或許會(huì)使用一些工具??梢院?jiǎn)單地將運(yùn)行程序的計(jì)算機(jī)想象成廚師、瓦匠或汽車(chē)司機(jī)。

諸如 Prolog、Mercury、SQL、XSLT 這樣的語(yǔ)言、EBNF 語(yǔ)法和各種格式的真正配置文件,都 聲明某事是這種情況,或者應(yīng)用了某些約束。函數(shù)語(yǔ)言(比如 Haskell、ML、Dylan、Ocaml 和 Scheme)與此相似,但是它們更加強(qiáng)調(diào)陳述編程對(duì)象(遞歸、列表,等等)之間的內(nèi)部(函數(shù))關(guān)系。我們的日常生活(至少在敘事質(zhì)量方面)沒(méi)有提供對(duì)這些語(yǔ)言的編程構(gòu)造的直接模擬。然而,對(duì)于那些可以用這些語(yǔ)言進(jìn)行描述的問(wèn)題來(lái)說(shuō),聲明性描述 遠(yuǎn)遠(yuǎn)比命令式解決方案來(lái)得簡(jiǎn)明且不易出錯(cuò)。例如,請(qǐng)研究下面這個(gè)線性方程組:
清單 1. 線性方程式系統(tǒng)樣本

10x + 5y - 7z + 1 = 0
17x + 5y - 10z + 3 = 0
5x - 4y + 3z - 6 = 0

這是個(gè)相當(dāng)漂亮的說(shuō)明對(duì)象(x、y 和 z)之間幾個(gè)關(guān)系的簡(jiǎn)單表達(dá)式。在現(xiàn)實(shí)生活中您可能會(huì)用不同的方式求出這些答案,但是實(shí)際上用筆和紙“求解 x”很煩,而且容易出錯(cuò)。從調(diào)試角度來(lái)講,用 Python 編寫(xiě)求解步驟或許會(huì)更糟糕。

Prolog 是與邏輯或數(shù)學(xué)關(guān)系密切的語(yǔ)言。使用這種語(yǔ)言,您只要編寫(xiě)您知道是正確的語(yǔ)句,然后讓?xiě)?yīng)用程序?yàn)槟贸鼋Y(jié)果。語(yǔ)句不是按照特定的順序構(gòu)成的(和線性方程式一樣,沒(méi)有順序),而且您(程序員或用戶)并不知道得出的結(jié)果都采用了哪些步驟。例如:
清單 2. family.pro Prolog 樣本

/* Adapted from sample at:

This app can answer questions about sisterhood & love, e.g.:
# Is alice a sister of harry?
?-sisterof( alice, harry )
# Which of alice' sisters love wine?
?-sisterof( X, alice ), love( X, wine)
*/
sisterof( X, Y ) :- parents( X, M, F ),
  female( X ),
  parents( Y, M, F ).
parents( edward, victoria, albert ).
parents( harry, victoria, albert ).
parents( alice, victoria, albert ).
female( alice ).
loves( harry, wine ).
loves( alice, wine ).

它和 EBNF(擴(kuò)展巴科斯范式,Extended Backus-Naur Form)語(yǔ)法聲明并不完全一樣,但是實(shí)質(zhì)相似。您可以編寫(xiě)一些下面這樣的聲明:
清單 3. EBNF 樣本

word := alphanums, (wordpunct, alphanums)*, contraction?
alphanums := [a-zA-Z0-9]+
wordpunct := [-_]
contraction := "'", ("clock"/"d"/"ll"/"m"/"re"/"s"/"t"/"ve")

如果您遇到一個(gè)單詞而想要表述其看上去 可能會(huì)是什么,而實(shí)際上又不想給出如何識(shí)別它的序列指令,上面便是個(gè)簡(jiǎn)練的方法。正則表達(dá)式與此相似(并且事實(shí)上它能夠滿足這種特定語(yǔ)法產(chǎn)品的需要)。

還有另一個(gè)聲明性示例,請(qǐng)研究描述有效 XML 文檔方言的文檔類(lèi)型聲明:
清單 4. XML 文檔類(lèi)型聲明







和其它示例一樣,DTD 語(yǔ)言不包含任何有關(guān)如何識(shí)別或創(chuàng)建有效 XML 文檔的指令。它只描述了如果文檔存在,那它會(huì)是怎么樣的。聲明性語(yǔ)言采用虛擬語(yǔ)氣。
Python 作為解釋器 vs Python 作為環(huán)境

Python 庫(kù)可以通過(guò)兩種截然不同的方式中的一種來(lái)利用聲明性語(yǔ)言?;蛟S更為常用的技術(shù)是將非 Python 聲明性語(yǔ)言作為數(shù)據(jù)來(lái)解析和處理。應(yīng)用程序或庫(kù)可以讀入外部來(lái)源(或者是內(nèi)部定義的但只用作“blob”的字符串),然后指出一組要執(zhí)行的命令式步驟,這些步驟在某種形式上與那些外部聲明是一致的。本質(zhì)上,這些類(lèi)型的庫(kù)是“數(shù)據(jù)驅(qū)動(dòng)的”系統(tǒng);聲明性語(yǔ)言和 Python 應(yīng)用程序執(zhí)行或利用其聲明的操作之間有著概念和范疇差別。事實(shí)上,相當(dāng)普遍的一點(diǎn)是,處理那些相同聲明的庫(kù)也被用來(lái)實(shí)現(xiàn)其它編程語(yǔ)言。

上面給出的所有示例都屬于第一種技術(shù)。庫(kù) PyLog 是 Prolog 系統(tǒng)的 Python 實(shí)現(xiàn)。它讀取像樣本那樣的 Prolog 數(shù)據(jù)文件,然后創(chuàng)建 Python 對(duì)象來(lái)對(duì) Prolog 聲明 建模。EBNF 樣本使用專(zhuān)門(mén)變體 SimpleParse ,這是一個(gè) Python 庫(kù),它將這些聲明轉(zhuǎn)換成可以被 mx.TextTools 所使用的狀態(tài)表。 mx.TextTools 自身是 Python 的擴(kuò)展庫(kù),它使用底層 C 引擎來(lái)運(yùn)行存儲(chǔ)在 Python 數(shù)據(jù)結(jié)構(gòu)中的代碼,但與 Python 本質(zhì)上幾乎沒(méi)什么關(guān)系。對(duì)于這些任務(wù)而言,Python 是極佳的 粘合劑,但是粘合在一起的語(yǔ)言與 Python 差別很大。而且,大多數(shù) Prolog 實(shí)現(xiàn)都不是用 Python 編寫(xiě)的,這和大多數(shù) EBNF 解析器一樣。

DTD 類(lèi)似于其它示例。如果您使用象 xmlproc 這樣的驗(yàn)證解析器,您可以利用 DTD 來(lái)驗(yàn)證 XML 文檔的方言。但是 DTD 的語(yǔ)言并不是 Python 式的, xmlproc 只將它用作需要解析的數(shù)據(jù)。而且,已經(jīng)用許多編程語(yǔ)言編寫(xiě)過(guò) XML 驗(yàn)證解析器。XSLT 轉(zhuǎn)換與此相似,也不是特定于 Python 的,而且像 ft.4xslt 這樣的模塊只將 Python 用作“粘合劑”。

雖然上面的方法和上面所提到的工具(我一直都在使用)都沒(méi)什么 不對(duì),但如果 Python 本身是聲明性語(yǔ)言的話,那么它可能會(huì)更精妙,而且某些方面會(huì)表達(dá)得更清晰。如果沒(méi)有其它因素的話,有助于此的庫(kù)不會(huì)使程序員在編寫(xiě)一個(gè)應(yīng)用程序時(shí)考慮是否采用兩種(或更多)語(yǔ)言。有時(shí),依靠 Python 的自省能力來(lái)實(shí)現(xiàn)“本機(jī)”聲明,既簡(jiǎn)單又管用。

自省的魔力

解析器 Spark 和 PLY 讓用戶 用 Python 來(lái)聲明 Python 值,然后使用某些魔法來(lái)讓 Python 運(yùn)行時(shí)環(huán)境進(jìn)行解析配置。例如,讓我們研究一下與前面 SimpleParse 語(yǔ)法等價(jià)的 PLY 語(yǔ)法。 Spark 類(lèi)似于下面這個(gè)示例:
清單 5. PLY 樣本

tokens = ('ALPHANUMS','WORDPUNCT','CONTRACTION','WHITSPACE')
t_ALPHANUMS = r"[a-zA-Z0-0]+"
t_WORDPUNCT = r"[-_]"
t_CONTRACTION = r"'(clock|d|ll|m|re|s|t|ve)"
def t_WHITESPACE(t):
 r"s+"
 t.value = " "
 return t
import lex
lex.lex()
lex.input(sometext)
while 1:
 t = lex.token()
 if not t: break

我已經(jīng)在我即將出版的書(shū)籍 Text Processing in Python 中編寫(xiě)了有關(guān) PLY 的內(nèi)容,并且在本專(zhuān)欄文章中編寫(xiě)了有關(guān) Spark 的內(nèi)容(請(qǐng)參閱 參考資料以獲取相應(yīng)鏈接)。不必深入了解庫(kù)的詳細(xì)信息,這里您應(yīng)當(dāng)注意的是:正是 Python 綁定本身配置了解析(在這個(gè)示例中實(shí)際是詞法分析/標(biāo)記化)。 PLY 模塊在 Python 環(huán)境中運(yùn)行以作用于這些模式聲明,因此就正好非常了解該環(huán)境。

PLY如何得知它自己做什么,這涉及到一些非常奇異的 Python 編程。起初,中級(jí)程序員會(huì)發(fā)現(xiàn)可以查明 globals() 和 locals() 字典的內(nèi)容。如果聲明樣式略有差異的話就好了。例如,假想代碼更類(lèi)似于這樣:
清單 6. 使用導(dǎo)入的模塊名稱(chēng)空間

import basic_lex as _
_.tokens = ('ALPHANUMS','WORDPUNCT','CONTRACTION')
_.ALPHANUMS = r"[a-zA-Z0-0]+"
_.WORDPUNCT = r"[-_]"
_.CONTRACTION = r"'(clock|d|ll|m|re|s|t|ve)"
_.lex()

這種樣式的聲明性并不差,而且可以假設(shè) basic_lex 模塊包含類(lèi)似下面這樣的簡(jiǎn)單內(nèi)容:
清單 7. basic_lex.py

def lex():
 for t in tokens:
 print t, '=', globals()[t]

這會(huì)產(chǎn)生:

% python basic_app.py
ALPHANUMS = [a-zA-Z0-0]+
WORDPUNCT = [-_]
CONTRACTION = '(clock|d|ll|m|re|s|t|ve)

PLY 設(shè)法使用堆棧幀信息插入了導(dǎo)入模塊的名稱(chēng)空間。例如:
清單 8. magic_lex.py

import sys
try: raise RuntimeError
except RuntimeError:
 e,b,t = sys.exc_info()
 caller_dict = t.tb_frame.f_back.f_globals
def lex():
 for t in caller_dict['tokens']:
 print t, '=', caller_dict['t_'+t]

這產(chǎn)生了與 basic_app.py 樣本所給輸出一樣的輸出,但是具有使用前面 t_TOKEN 樣式的聲明。

實(shí)際的 PLY 模塊中要比這更神奇。我們看到用模式 t_TOKEN 命名的標(biāo)記實(shí)際上可以是包含了正則表達(dá)式的字符串,或是包含了正則表達(dá)式文檔字符串和操作代碼的函數(shù)。某些類(lèi)型檢查允許以下多態(tài)行為:
清單 9. polymorphic_lex

# ...determine caller_dict using RuntimeError...
from types import *
def lex():
 for t in caller_dict['tokens']:
 t_obj = caller_dict['t_'+t]
 if type(t_obj) is FunctionType:
 print t, '=', t_obj.__doc__
 else:
 print t, '=', t_obj

顯然,相對(duì)于用來(lái)玩玩的示例而言,真正的 PLY 模塊用這些已聲明的模式可以做更有趣的事,但是這些示例演示了其中所涉及的一些技術(shù)。

繼承的魔力

讓支持庫(kù)到處插入并操作應(yīng)用程序的名稱(chēng)空間,這會(huì)啟用精妙的聲明性樣式。但通常,將繼承結(jié)構(gòu)和自省一起使用會(huì)使靈活性更佳。

模塊 gnosis.xml.validity 是用來(lái)創(chuàng)建直接映射到 DTD 產(chǎn)品的類(lèi)的框架。任何 gnosis.xml.validity 類(lèi) 只能用符合 XML 方言有效性約束的參數(shù)進(jìn)行實(shí)例化。實(shí)際上,這并不十分正確;當(dāng)只存在一種明確的方式可將參數(shù)“提升”成正確類(lèi)型時(shí),模塊也可從更簡(jiǎn)單的參數(shù)中推斷出正確類(lèi)型。

由于我已經(jīng)編寫(xiě)了 gnosis.xml.validity 模塊,所以我傾向于思考其用途自身是否有趣。但是對(duì)于本文,我只想研究創(chuàng)建有效性類(lèi)的聲明性樣式。與前面的 DTD 樣本相匹配的一組規(guī)則/類(lèi)包括:
清單 10. gnosis.xml.validity 規(guī)則聲明

from gnosis.xml.validity import *
class figure(EMPTY): pass
class _mixedpara(Or): _disjoins = (PCDATA, figure)
class paragraph(Some): _type = _mixedpara
class title(PCDATA): pass
class _paras(Some): _type = paragraph
class chapter(Seq): _order = (title, _paras)
class dissertation(Some): _type = chapter

您可以使用以下命令從這些聲明中創(chuàng)建出實(shí)例:

ch1 = LiftSeq(chapter, ("1st Title","Validity is important"))
ch2 = LiftSeq(chapter, ("2nd Title","Declaration is fun"))
diss = dissertation([ch1, ch2])
print diss

請(qǐng)注意這些類(lèi)和前面的 DTD 非常匹配。映射基本上是一一對(duì)應(yīng)的;除了有必要對(duì)嵌套標(biāo)記的量化和交替使用中介體之外(中介體名稱(chēng)用前導(dǎo)下劃線標(biāo)出來(lái))。

還要注意的是,這些類(lèi)雖然是用標(biāo)準(zhǔn) Python 語(yǔ)法創(chuàng)建的,但它們也有不同尋常(且更簡(jiǎn)練)之處:它們沒(méi)有方法或?qū)嵗龜?shù)據(jù)。單獨(dú)定義類(lèi),以便從某框架繼承類(lèi),而該框架受到單一的類(lèi)屬性限制。例如, 是其它標(biāo)記序列,即 后面跟著一個(gè)或多個(gè) <paragraph> 標(biāo)記。但是為確保在實(shí)例中遵守約束,我們所需做的就是用這種簡(jiǎn)單的方式來(lái) 聲明chapter 類(lèi)。</p> <p>編寫(xiě)像 gnosis.xml.validity.Seq 這樣的父類(lèi)程序所涉及的主要“技巧”,就是在初始化期間研究 實(shí)例的 .__class__ 屬性。類(lèi) chapter 自身并不進(jìn)行初始化,因此調(diào)用其父類(lèi)的 __init__() 方法。但是傳遞給父類(lèi) __init__() 的 self 是 chapter 的實(shí)例,而且 self 知道 chapter。為了舉例說(shuō)明這一點(diǎn),下面列出了部分 gnosis.xml.validity.Seq 實(shí)現(xiàn):<br /> 清單 11. 類(lèi) gnosis.xml.validity.Seq</p> <p> <div id="m4eiwwv" class="51ds_code" style="position: relative;"><pre class="brush:py;"> class Seq(tuple): def __init__(self, inittup): if not hasattr(self.__class__, '_order'): raise NotImplementedError, "Child of Abstract Class Seq must specify order" if not isinstance(self._order, tuple): raise ValidityError, "Seq must have tuple as order" self.validate() self._tag = self.__class__.__name__ </pre></div> </p> <p>一旦應(yīng)用程序程序員試圖創(chuàng)建 chapter 實(shí)例,實(shí)例化代碼就檢查是否用所要求的 ._order 類(lèi)屬性聲明了 chapter ,并檢查該屬性是否為所需的元組對(duì)象。方法 .validate() 要做進(jìn)一步的檢查,以確保初始化實(shí)例所用的對(duì)象屬于 ._order 中指定的相應(yīng)類(lèi)。</p> <p>何時(shí)聲明</p> <p>聲明性編程樣式在聲明約束方面 幾乎一直比命令式或過(guò)程式樣式更直接。當(dāng)然,并非所有的編程問(wèn)題都是關(guān)于約束的 - 或者說(shuō)至少這并非總是自然定律。但是如果基于規(guī)則的系統(tǒng)(比如語(yǔ)法和推理系統(tǒng))可以進(jìn)行聲明性描述,那么它們的問(wèn)題就比較容易處理了。是否符合語(yǔ)法的命令式驗(yàn)證很快就會(huì)變成非常復(fù)雜難懂的所謂“意大利面條式代碼”(spaghetti code),而且很難調(diào)試。模式和規(guī)則的聲明仍然可以更簡(jiǎn)單。</p> <p>當(dāng)然,起碼在 Python 中,聲明規(guī)則的驗(yàn)證和增強(qiáng)總是會(huì)歸結(jié)為過(guò)程式檢查。但是把這種過(guò)程式檢查放在進(jìn)行了良好測(cè)試的庫(kù)代碼中比較合適。單獨(dú)的應(yīng)用程序應(yīng)該依靠由像 Spark 或 PLY 或 gnosis.xml.validity 這樣的庫(kù)所提供的更簡(jiǎn)單的聲明性接口。其它像 xmlproc 、 SimpleParse 或 ft.4xslt 這樣的庫(kù),盡管不是 用 Python進(jìn)行聲明的(Python 當(dāng)然適用于它們的領(lǐng)域),也能使用聲明性樣式。 </p><p><script type="text/javascript" src="https://jss.51dongshi.com/pcwz/dysph.js"></script><p><strong>聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com</strong></p></div> <div id="vejb3bs" class="downbox clearfix"> <div id="wbe1fj7" class="ico"><img src="https://js.51dongshi.com/tpl/pc2/images/document.png" alt="文檔"></div> <div id="j6hm1bi" class="txt"> <h4>用Python創(chuàng)建聲明性迷你語(yǔ)言的教程</h4> <div id="cdpvdox" class="co">用Python創(chuàng)建聲明性迷你語(yǔ)言的教程:大多數(shù)程序員考慮編程時(shí),他們都要設(shè)想用于編寫(xiě)應(yīng)用程序的 命令式樣式和技術(shù)。最受歡迎的通用編程語(yǔ)言(包括 Python 和其它面向?qū)ο蟮恼Z(yǔ)言)在樣式上絕大多數(shù)都是命令式的。另一方面,也有許多編程語(yǔ)言是 聲明性樣式,包括函數(shù)語(yǔ)言和邏輯語(yǔ)言,還包括通用語(yǔ)言</div> <div id="e2ilt2e" class="tj"><b>推薦度:</b><div id="rw6ljs7" class="tj_stars_list"><i class="tj_stars tj_05"></i></div></div> </div> <div id="vuoyjiv" class="btn"> <a href="javascript:;" class="html2word" data-model="article" data-id="casear" title="文檔下載"> <b>點(diǎn)擊下載本文</b> <span>文檔為doc格式</span> </a> </div> </div> <script>keji_detail_ga('article_content_bottom');</script> <div id="ubq7gui" class="tvideo_tag"> 標(biāo)簽: <a href="/tlist-1968/">創(chuàng)建</a> <a href="/tlist-9367/">使用</a> <a href="/tlist-78608/">語(yǔ)言</a> </div> <div id="ghsb6mj" class="tvideo_box tvideo_box_tab"> <div id="xzmnpv6" class="hd"> <ul><li id="vzku7dr" class="on">熱門(mén)焦點(diǎn)</li><script>keji_detail_ga('hot_jiaodian_tab_title');</script></ul> </div> <div id="fedh1tg" class="bd"> <ul class="ult_jpic clearfix"> <script>get_hot_jiaodian_content('wz_hot_jiaodian',33,'hot',1);</script> </ul> </div> </div> </div> <!--中間文章 end--> <!--右側(cè)專(zhuān)題 star--> <div id="xi64p12" class="ult_zt"> <script>keji_detail_ga('article_right_top');</script> <div id="dchq04n" class="ult_ztbox"> <h4>最新推薦</h4> <ul class="tvideo_r_a clearfix"> <script>get_detail_right('wz_right_new',33,'')</script> </ul> </div> <script>keji_detail_ga('article_right_middle');</script> <div id="pntmlot" class="ult_ztbox"> <h4>猜你喜歡</h4> <ul class="telist_rb clearfix"> <script>get_detail_right('wz_right_love',33,'')</script> </ul> </div> <script>keji_detail_ga('article_right_new_bottom');</script> <div id="jdrdnub" class="ult_ztbox"> <h4>熱門(mén)推薦</h4> <ul class="tvideo_r_b clearfix"> <script>get_detail_right('wz_right_hot',33,'')</script> </ul> </div> <script>keji_detail_ga('article_right_bottom');</script> </div> <!--右側(cè)專(zhuān)題 end--> <div style="display:none"><a href="http://m.gy2thfx.cn/wzztf/ca/casear/">專(zhuān)題</a> </div> </div> </div> <script src="https://js.51dongshi.com/plug/qrcode/qrcode.min.js"></script> <script src="https://js.51dongshi.com/js/share.js" charset="UTF-8"></script> <script type="text/javascript" src="https://js.51dongshi.com/tpl/pc2/js/waypoints.min.js"></script> <script type="text/javascript" src="https://js.51dongshi.com/tpl/pc2/js/icon_step.js"></script> <style> #qrcode{padding: 15px;background: #fff;} </style> <div class="e6s09r1" id="qrcode" style="display: none"></div> <script>new QRCode(document.getElementById("qrcode"), "https://m.51dongshi.com/eedfcasear.html");</script> <iframe src="https://hits.51dongshi.com/?biao=ho_article&id=893091" border="0" frameborder="0" style="width: 0px; height: 0px"></iframe> <script src="https://js.51dongshi.com/js/shHighlighter.js"></script> <link rel="stylesheet" > <script id="fffz" data-domain="http://m.gy2thfx.cn/index" src="https://js.51dongshi.com/js/fffz/fffz.js"></script> <script type="text/javascript" src="https://jss.51dongshi.com/pcwz/tj.js"></script> <div style="display:none"><script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://#/hm.js?4b1ebb0298b66c8a109db070c4878833"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> </div> <!--foot star--> <div id="u1lenaf" class="footer"> <div id="we6yhve" class="m_box"> <div id="pwehqrw" class="footer_in"> <a href="#" target="_blank">產(chǎn)品服務(wù)</a> <a href="#" target="_blank">發(fā)展歷程</a> <a href="#" target="_blank">企業(yè)資訊</a> <a href="#" target="_blank">企業(yè)文化</a> <a href="#" target="_blank">關(guān)于我們</a> <a href="#" target="_blank">加入我們</a> <a href="#" target="_blank">聯(lián)系我們</a> <a href="#" target="_blank">網(wǎng)站導(dǎo)航</a> <a href="#" target="_blank">網(wǎng)站律師</a> </div> <ul class="ftrlist"> <li> <a rel="nofollow" target="_blank"> <img src="https://js.51dongshi.com/tpl/pc2/images/footer_logo01.gif" alt="中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)"></a> </li> <li> <a rel="nofollow" target="_blank"> <img src="https://js.51dongshi.com/tpl/pc2/images/12377logo.png" alt="中國(guó)互聯(lián)網(wǎng)舉報(bào)中心"></a> </li> <li> <a rel="nofollow" target="_blank"> <img src="https://js.51dongshi.com/tpl/pc2/images/footer_logo05.gif" alt="網(wǎng)絡(luò)110報(bào)警服務(wù)"></a> </li> <li> <a rel="nofollow" target="_blank"> <img src="https://js.51dongshi.com/tpl/pc2/images/creditchina.gif" alt="信用中國(guó)"></a> </li> <li id="rsdffj2" class="last"> <a rel="nofollow" target="_blank"> <img src="https://js.51dongshi.com/tpl/pc2/images/footer_logo11.png" alt="中國(guó)掃黃打非網(wǎng)"><p>中國(guó)掃黃打非網(wǎng)</p> </a> </li> </ul> <div id="yz38fq1" class="footer_co"> <a href="/" class="footlogo"><img src="https://js.51dongshi.com/tpl/pc2/images/logo_bottom.png" alt="懂視"></a> <p>Copyright ? 2019-2023 <a href="/" target="_blank">51dongshi.com</a> 版權(quán)所有</p> <p> <a rel="nofollow" target="_blank" >贛ICP備2023002352號(hào)-2</a> </p> <p>違法及侵權(quán)請(qǐng)聯(lián)系:TEL:177 7030 7066 E-MAIL:11247931@qq.com 本站由北京市萬(wàn)商天勤律師事務(wù)所王興未律師提供法律服務(wù)</p> </div> </div> </div> <!--foot end--> <a href="#0" class="cd-top">Top</a> <script type="text/javascript"> $(function(){ var _line=parseInt($(window).height()/3); $(window).scroll(function(){ if ($(window).scrollTop()>100) { $('.edu_top').css({'position':'fixed','top':'0','z-index':'99'}) }else{ $('.edu_top').css({'position':'relative','top':'0'}) } }) }) </script> <script type="text/javascript" src="https://jss.51dongshi.com/ga/all.js"></script> <div style="display:none"> <script type="text/javascript" src="https://s9.#/z_stat.php?id=1278135046&web_id=1278135046"></script><script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://#/hm.js?70ec0a2c78df5a4a3d49e475e943ceb6"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script><script> (function(){ var src = (document.location.protocol == "http:") ? "https://js.passport.qihucdn.com/11.0.1.js?d1f620a645f12a1c5b0bbce7b998d51e":"https://jspassport.ssl.qhimg.com/11.0.1.js?d1f620a645f12a1c5b0bbce7b998d51e"; document.write('<script src="' + src + '" id="sozz"><\/script>'); })(); </script></div> <footer> <div class="friendship-link"> <p>感谢您访问我们的网站,您可能还对以下资源感兴趣:</p> <a href="http://m.gy2thfx.cn/" title="99热这里热这里只有精品">99热这里热这里只有精品</a> <div class="friend-links"> </div> </div> </footer> <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body><div id="emieu" class="pl_css_ganrao" style="display: none;"><ul id="emieu"><optgroup id="emieu"></optgroup></ul><strike id="emieu"><meter id="emieu"></meter></strike><th id="emieu"><blockquote id="emieu"><dd id="emieu"></dd></blockquote></th><dl id="emieu"><fieldset id="emieu"><tbody id="emieu"></tbody></fieldset></dl><noframes id="emieu"><object id="emieu"></object></noframes><acronym id="emieu"><form id="emieu"><menu id="emieu"></menu></form></acronym><dl id="emieu"><small id="emieu"></small></dl><label id="emieu"><label id="emieu"><optgroup id="emieu"><optgroup id="emieu"></optgroup></optgroup></label></label><code id="emieu"></code><form id="emieu"></form><video id="emieu"><dd id="emieu"><ruby id="emieu"><td id="emieu"></td></ruby></dd></video><table id="emieu"></table><source id="emieu"></source><li id="emieu"></li><dfn id="emieu"><b id="emieu"></b></dfn><small id="emieu"></small><dfn id="emieu"></dfn><dfn id="emieu"></dfn><th id="emieu"></th><var id="emieu"></var><button id="emieu"><acronym id="emieu"><acronym id="emieu"><sup id="emieu"></sup></acronym></acronym></button><meter id="emieu"><meter id="emieu"></meter></meter><center id="emieu"><center id="emieu"><pre id="emieu"></pre></center></center><tbody id="emieu"></tbody><samp id="emieu"></samp><pre id="emieu"></pre><menuitem id="emieu"></menuitem><fieldset id="emieu"><div id="emieu"><table id="emieu"></table></div></fieldset><abbr id="emieu"><pre id="emieu"></pre></abbr><video id="emieu"><tbody id="emieu"><pre id="emieu"><ruby id="emieu"></ruby></pre></tbody></video><acronym id="emieu"><ol id="emieu"><samp id="emieu"><xmp id="emieu"></xmp></samp></ol></acronym><td id="emieu"><td id="emieu"><source id="emieu"></source></td></td><code id="emieu"></code><fieldset id="emieu"></fieldset><i id="emieu"></i><em id="emieu"><small id="emieu"><noscript id="emieu"></noscript></small></em><strong id="emieu"><strong id="emieu"><dfn id="emieu"><dfn id="emieu"></dfn></dfn></strong></strong><noscript id="emieu"><sup id="emieu"><abbr id="emieu"></abbr></sup></noscript><menu id="emieu"></menu><button id="emieu"><pre id="emieu"><strong id="emieu"><sup id="emieu"></sup></strong></pre></button><thead id="emieu"></thead><blockquote id="emieu"></blockquote><font id="emieu"><font id="emieu"><cite id="emieu"><sub id="emieu"></sub></cite></font></font><ins id="emieu"></ins><ol id="emieu"><ol id="emieu"><xmp id="emieu"><xmp id="emieu"></xmp></xmp></ol></ol><samp id="emieu"><xmp id="emieu"></xmp></samp><abbr id="emieu"></abbr><th id="emieu"><th id="emieu"></th></th><video id="emieu"></video><option id="emieu"><big id="emieu"></big></option></div> </html>