內(nèi)褲可以用來遮羞,但是到了冬天它沒法為我們防風(fēng)御寒,聰明的人們發(fā)明了長(zhǎng)褲,有了長(zhǎng)褲后寶寶再也不冷了,裝飾器就像我們這里說的長(zhǎng)褲,在不影響內(nèi)褲作用的前提下,給我們的身子提供了保暖的功效。
成都創(chuàng)新互聯(lián)長(zhǎng)期為上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為安居企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、做網(wǎng)站,安居網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
再回到我們的主題
裝飾器本質(zhì)上是一個(gè)Python函數(shù),它可以讓其他函數(shù)在不需要做任何代碼變動(dòng)的前提下增加額外功能,裝飾器的返回值也是一個(gè)函數(shù)對(duì)象。它經(jīng)常用于有切面需求的場(chǎng)景,比如:插入日志、性能測(cè)試、事務(wù)處理、緩存、權(quán)限校驗(yàn)等場(chǎng)景。裝飾器是解決這類問題的絕佳設(shè)計(jì),有了裝飾器,我們就可以抽離出大量與函數(shù)功能本身無關(guān)的雷同代碼并繼續(xù)重用。概括的講,裝飾器的作用就是為已經(jīng)存在的對(duì)象添加額外的功能。
先來看一個(gè)簡(jiǎn)單例子:
def foo():
print('i am foo')
現(xiàn)在有一個(gè)新的需求,希望可以記錄下函數(shù)的執(zhí)行日志,于是在代碼中添加日志代碼:
def foo():
print('i am foo')
logging.info("foo is running")
bar()、bar2()也有類似的需求,怎么做?再寫一個(gè)logging在bar函數(shù)里?這樣就造成大量雷同的代碼,為了減少重復(fù)寫代碼,我們可以這樣做,重新定義一個(gè)函數(shù):專門處理日志 ,日志處理完之后再執(zhí)行真正的業(yè)務(wù)代碼
def use_logging(func):
logging.warn("%s is running" % func.__name__)
func()
def bar():
print('i am bar')
use_logging(bar)
邏輯上不難理解, 但是這樣的話,我們每次都要將一個(gè)函數(shù)作為參數(shù)傳遞給use_logging函數(shù)。而且這種方式已經(jīng)破壞了原有的代碼邏輯結(jié)構(gòu),之前執(zhí)行業(yè)務(wù)邏輯時(shí),執(zhí)行運(yùn)行bar(),但是現(xiàn)在不得不改成use_logging(bar)。那么有沒有更好的方式的呢?當(dāng)然有,答案就是裝飾器。
簡(jiǎn)單裝飾器
def use_logging(func):
def wrapper(*args, **kwargs):
logging.warn("%s is running" % func.__name__)
return func(*args, **kwargs)
return wrapper
def bar():
print('i am bar')
bar = use_logging(bar)
bar()
函數(shù)use_logging就是裝飾器,它把執(zhí)行真正業(yè)務(wù)方法的func包裹在函數(shù)里面,看起來像bar被use_logging裝飾了。在這個(gè)例子中,函數(shù)進(jìn)入和退出時(shí) ,被稱為一個(gè)橫切面(Aspect),這種編程方式被稱為面向切面的編程(Aspect-Oriented Programming)。
@符號(hào)是裝飾器的語法糖,在定義函數(shù)的時(shí)候使用,避免再一次賦值操作
def use_logging(func):
def wrapper(*args, **kwargs):
logging.warn("%s is running" % func.__name__)
return func(*args)
return wrapper
@use_logging
def foo():
print("i am foo")
@use_logging
def bar():
print("i am bar")
bar()
如上所示,這樣我們就可以省去bar = use_logging(bar)這一句了,直接調(diào)用bar()即可得到想要的結(jié)果。如果我們有其他的類似函數(shù),我們可以繼續(xù)調(diào)用裝飾器來修飾函數(shù),而不用重復(fù)修改函數(shù)或者增加新的封裝。這樣,我們就提高了程序的可重復(fù)利用性,并增加了程序的可讀性。
裝飾器在Python使用如此方便都要?dú)w因于Python的函數(shù)能像普通的對(duì)象一樣能作為參數(shù)傳遞給其他函數(shù),可以被賦值給其他變量,可以作為返回值,可以被定義在另外一個(gè)函數(shù)內(nèi)。
帶參數(shù)的裝飾器
裝飾器還有更大的靈活性,例如帶參數(shù)的裝飾器:在上面的裝飾器調(diào)用中,比如@use_logging,該裝飾器唯一的參數(shù)就是執(zhí)行業(yè)務(wù)的函數(shù)。裝飾器的語法允許我們?cè)谡{(diào)用時(shí),提供其它參數(shù),比如@decorator(a)。這樣,就為裝飾器的編寫和使用提供了更大的靈活性。
def use_logging(level):
def decorator(func):
def wrapper(*args, **kwargs):
if level == "warn":
logging.warn("%s is running" % func.__name__)
return func(*args)
return wrapper
return decorator
@use_logging(level="warn")
def foo(name='foo'):
print("i am %s" % name)
foo()
上面的use_logging是允許帶參數(shù)的裝飾器。它實(shí)際上是對(duì)原有裝飾器的一個(gè)函數(shù)封裝,并返回一個(gè)裝飾器。我們可以將它理解為一個(gè)含有參數(shù)的閉包。當(dāng)我 們使用@use_logging(level="warn")調(diào)用的時(shí)候,Python能夠發(fā)現(xiàn)這一層的封裝,并把參數(shù)傳遞到裝飾器的環(huán)境中。
類裝飾器
再來看看類裝飾器,相比函數(shù)裝飾器,類裝飾器具有靈活度大、高內(nèi)聚、封裝性等優(yōu)點(diǎn)。使用類裝飾器還可以依靠類內(nèi)部的\_\_call\_\_方法,當(dāng)使用 @ 形式將裝飾器附加到函數(shù)上時(shí),就會(huì)調(diào)用此方法。
class Foo(object):
def __init__(self, func):
self._func = func
def __call__(self):
print ('class decorator runing')
self._func()
print ('class decorator ending')
@Foo
def bar():
print ('bar')
bar()
functools.wraps
使用裝飾器極大地復(fù)用了代碼,但是他有一個(gè)缺點(diǎn)就是原函數(shù)的元信息不見了,比如函數(shù)的docstring、__name__、參數(shù)列表,先看例子:
裝飾器
def logged(func):
def with_logging(*args, **kwargs):
print func.__name__ + " was called"
return func(*args, **kwargs)
return with_logging
函數(shù)
@logged
def f(x):
"""does some math"""
return x + x * x
該函數(shù)完成等價(jià)于:
def f(x):
"""does some math"""
return x + x * x
f = logged(f)
不難發(fā)現(xiàn),函數(shù)f被with_logging取代了,當(dāng)然它的docstring,__name__就是變成了with_logging函數(shù)的信息了。
print f.__name__ # prints 'with_logging'
print f.__doc__ # prints None
這個(gè)問題就比較嚴(yán)重的,好在我們有functools.wraps,wraps本身也是一個(gè)裝飾器,它能把原函數(shù)的元信息拷貝到裝飾器函數(shù)中,這使得裝飾器函數(shù)也有和原函數(shù)一樣的元信息了。
from functools import wraps
def logged(func):
@wraps(func)
def with_logging(*args, **kwargs):
print func.__name__ + " was called"
return func(*args, **kwargs)
return with_logging
@logged
def f(x):
"""does some math"""
return x + x * x
print f.__name__ # prints 'f'
print f.__doc__ # prints 'does some math'
內(nèi)置裝飾器
@staticmathod、@classmethod、@property
裝飾器的順序
@a
@b
@c
def f ():
等效于
f = a(b(c(f)))
編輯于 2016-08-09
8 條評(píng)論
感謝
分享
收藏
?
沒有幫助
?
舉報(bào)
?
作者保留權(quán)利
收起
4
贊同
反對(duì),不會(huì)顯示你的姓名
許多人選擇編程是因?yàn)樗麄兿矚g把時(shí)間花在…
4 人贊同
先理解一下閉包的概念吧,之前回答過一個(gè)有關(guān)閉包和裝飾器的問題,可以參考一下:Python 里函數(shù)里返回一個(gè)函數(shù)內(nèi)部定義的函數(shù)? - 知乎用戶的回答
顯示全部
先理解一下閉包的概念吧,之前回答過一個(gè)有關(guān)閉包和裝飾器的問題,可以參考一下:
Python 里函數(shù)里返回一個(gè)函數(shù)內(nèi)部定義的函數(shù)? - 知乎用戶的回答
發(fā)布于 2014-12-09
2 條評(píng)論
感謝
分享
收藏
?
沒有幫助
?
舉報(bào)
?
作者保留權(quán)利
1
贊同
反對(duì),不會(huì)顯示你的姓名
裝飾器(decorator)是Python中的高級(jí)語法。裝飾的意思就是動(dòng)態(tài)擴(kuò)展被裝飾對(duì)象的功能。裝飾器可以用于裝飾函數(shù)、方法和類。
一 嵌套函數(shù)
# 定義一個(gè)外層函數(shù)def foo(): # 定義了一個(gè)內(nèi)部函數(shù) def bar(): print("hello world")
函數(shù)bar是一個(gè)定義在foo函數(shù)內(nèi)部的函數(shù)。
Python中的函數(shù)是支持嵌套的,也就是可以在一個(gè)函數(shù)內(nèi)部再定義一個(gè)函數(shù)。
然后,我們還知道函數(shù)是可以當(dāng)作變量的,于是我們就可以在foo函數(shù)中把定義的這個(gè)bar函數(shù)返回。就像下面這樣:
# 定義一個(gè)外層函數(shù)def foo(): # 定義了一個(gè)內(nèi)層函數(shù) def bar(): print("hello world") return
barfunc = foo()func() # func -- bar,這里執(zhí)行func其實(shí)就相當(dāng)于執(zhí)行了在foo函數(shù)內(nèi)部定義的bar函數(shù)
二 閉包形態(tài)1
# 閉包形態(tài)1def foo(): name = "Andy" # 外部函數(shù)的局部變量 # 定義了一個(gè)內(nèi)部函數(shù) def bar():
print(name) # 雖然bar函數(shù)中沒有定義name變量,但是它可以訪問外部函數(shù)的局部變量name return barfunc =
foo()func() # func -- bar -- 除了是一個(gè)函數(shù),還包含一個(gè)值(它外層函數(shù)的局部變量)的引用
三 閉包形態(tài)2
# 閉包形態(tài)2def foo(name): # 給一個(gè)函數(shù)傳參也相當(dāng)于給函數(shù)定義了一個(gè)局部變量 # 定義了一個(gè)內(nèi)部函數(shù) def bar():
print(name) # 內(nèi)部函數(shù)同樣可以獲取到傳到外部函數(shù)的變量(參數(shù)) return barfunc = foo("Andy") #
把“Andy”當(dāng)成參數(shù)傳入foo函數(shù) -- 其內(nèi)部定義的bar函數(shù)也能拿到這個(gè)“Andy”func() # func -- bar --
除了是一個(gè)函數(shù),還包含一個(gè)值(它外層函數(shù)的參數(shù))的引用
四 裝飾器形態(tài)1
# 還是定義一個(gè)外層函數(shù)def foo(name): # 我接收的參數(shù)是一個(gè)函數(shù)名 # 定義了一個(gè)內(nèi)部函數(shù) def bar():
print("這是新功能。。。") # 新功能 name() # 函數(shù)名加()就相當(dāng)于執(zhí)行-- 我傳進(jìn)來原函數(shù)的函數(shù)名,這里就相當(dāng)于執(zhí)行了原函數(shù)
return bar# 定義一個(gè)被裝飾的函數(shù)def f1(): print("hello world.") # 用foo函數(shù)裝飾f1函數(shù)f1 =
foo(f1)# 不改變f1的調(diào)用方式f1() # -- 此時(shí)函數(shù)已經(jīng)擴(kuò)展了新功能
五 裝飾器形態(tài)2
# 還是定義一個(gè)外層函數(shù)def foo(name): # 接收的參數(shù)是一個(gè)函數(shù)名 # 定義了一個(gè)內(nèi)部函數(shù) def bar():
print("這是新功能。。。") # 新功能 name() # 函數(shù)名加()就相當(dāng)于執(zhí)行-- 傳進(jìn)來原函數(shù)的函數(shù)名,這里就相當(dāng)于執(zhí)行了原函數(shù)
return bar# 定義一個(gè)被裝飾的函數(shù)# 用foo函數(shù)裝飾f1函數(shù)@foo # 使用f1 =
foo(f1)語法裝飾的話稍顯啰嗦,Python就提供了@語法,讓裝飾過程更簡(jiǎn)便def f1(): print("hello world.") #
不改變f1的調(diào)用方式f1() # -- 此時(shí)函數(shù)已經(jīng)擴(kuò)展了新功能。
近日,幫女朋友畫截?cái)鄨D時(shí),遇到了一些問題,網(wǎng)上很多資料都是互相粘貼,缺少能夠解決問題的帖子,經(jīng)過查看官方api最終解決了問題。
在此記錄一下,也希望能夠幫助其他有需要的人。
這個(gè)是最方便的一種解決辦法,官網(wǎng)地址為 Pypi ,官網(wǎng)的教程比較簡(jiǎn)潔
即可以得到可用的圖:
看著效果好像還不錯(cuò),但是如果要畫柱狀圖,則如何解決呢?
仿照官方的程序,我們可以寫出來以下的程序
得到以下圖:
這個(gè)圖我們可以發(fā)現(xiàn)存在一定的問題,它的橫坐標(biāo)不對(duì)了,我們的“1”顯示不出來了!!!
那怎么解決呢?可以知道我們?cè)赽ar()函數(shù)中使用 tick_label=name_list 是不可行的了,那我們?cè)囅?plt.xticks 函數(shù)看看
首先刪除bar函數(shù)中的 tick_label=name_list ,然后在 plt.show() 前面加上 plt.xticksx,name_list) ,得到下圖結(jié)果
我們通過對(duì)比這兩個(gè)圖,可以發(fā)現(xiàn)一個(gè)很trick的解決辦法!
第一個(gè)圖,沒有自帶的刻度,但是少了一個(gè)我們想要的刻度;第二個(gè)圖,存在自帶的刻度,但是我們想要的刻度全都有!
我們能不能考慮結(jié)合下呢?
我們嘗試在bar中加上一個(gè)空的刻度,然后再顯示出來
因此,這個(gè)方案在一些簡(jiǎn)單的圖上還可以應(yīng)用,復(fù)雜的場(chǎng)景就難以解決了!
matplotlib具有很強(qiáng)的自定義能力,我們可以考慮通過畫兩個(gè)子圖,然后拼接成一個(gè),來生成我們的截?cái)鄨D!
看著結(jié)果似乎還不錯(cuò),坐標(biāo)的刻度也顯示正常啦
只是,由于我們使用subplot畫出來的兩個(gè)圖默認(rèn)大小是一樣的,而前文使用brokenaxes畫出來的截?cái)嗌舷碌拈L(zhǎng)度并不一樣。我們這樣畫出來的圖不好看,還需要調(diào)整下!
考慮到matplotlib可以使用grid來畫圖,我們嘗試用它來調(diào)整下上下兩圖的比例!
畫出來的結(jié)果好看多了!
重新畫一下圖
問題解決了!
我們得到了一個(gè)完整的圖!
參考文獻(xiàn):
一、使用numpy生成長(zhǎng)度為100的等差序列作為自變量,命名為x,并使用三角函數(shù)SiNx和cosx**2生成兩個(gè)因變量,命名為y和Z。
二、設(shè)置畫布的大小、顏色、寬度、類型和標(biāo)簽。
三、通過plt.figure(figsize=(10,6))的畫布。圖((10,6))。
四、嘗試plt.plot(x,y,color='red',linewidth=2,label='$\sinx$')和plt.plot(x,z,'b--',label='$\cosx^2$')。
五、分通過plt.xlabel('T')和plt.ylabel('V')設(shè)置X和Y軸的軸標(biāo)簽;并通過plt.title('V changes by T')為圖形設(shè)置標(biāo)題。
六、Y[:,0]=Y[:,0]*888表示修改第一個(gè)數(shù)據(jù)并將其展開888次;之后,使用上述設(shè)置時(shí)保持不變,發(fā)現(xiàn)另一行幾乎是一條直線。
如何用python繪制簡(jiǎn)單條形圖呢?這里離不開matplotlib的使用。
條形圖是數(shù)據(jù)可視化圖形中很基礎(chǔ)也很常用的一種圖,簡(jiǎn)單解釋下:條形圖也叫長(zhǎng)條圖(英語:bar chart),亦稱條圖(英語:bar graph)、條狀圖、棒形圖、柱狀圖、條形圖表,是一種以長(zhǎng)方形的長(zhǎng)度為變量的統(tǒng)計(jì)圖表。長(zhǎng)條圖用來比較兩個(gè)或以上的價(jià)值(不同時(shí)間或者不同條件),只有一個(gè)變量,通常利用于較小的數(shù)據(jù)集分析。長(zhǎng)條圖亦可橫向排列,或用多維方式表達(dá)。
那么一個(gè)普通的條形圖是長(zhǎng)什么樣子的呢?
當(dāng)!當(dāng)!當(dāng)!就是下圖的這個(gè)樣子:
圖先亮出來啦,接下來研究這個(gè)圖是怎么畫的吧,先看一下原數(shù)據(jù)長(zhǎng)什么樣子:
實(shí)際畫圖的流程和畫折線圖很相近,只是用到的畫圖函數(shù)不一樣,繪制條形圖的函數(shù)plt.bar():
由于這只是最簡(jiǎn)單的一個(gè)條形圖,實(shí)際上條形圖的函數(shù)plt.bar()還有不少可以探索的參數(shù)設(shè)置,和對(duì)折線圖函數(shù)plt.plot()的探索差不多,有興趣的孩子可以自己去進(jìn)行探索哦。
按照條形長(zhǎng)短進(jìn)行排序展示的條形圖
當(dāng)然也可以有其他的設(shè)置,比如說上圖中的線條高低參差不齊,這是因?yàn)閤軸的數(shù)據(jù)是按照學(xué)校名稱進(jìn)行排序的,那么可不可以按照分?jǐn)?shù)的高低進(jìn)行排序呢?也就是讓所有的長(zhǎng)方形按照從高到矮或者從矮到高的順序進(jìn)行排列?
當(dāng)然可以啦!這里需要強(qiáng)調(diào)的是,條的高低排列等信息都是來源于原數(shù)據(jù)的,要想讓條形的順序發(fā)生改變,需要對(duì)畫圖的來源數(shù)據(jù)進(jìn)行更改呢!
把原數(shù)據(jù)逆序排序后截取前十名數(shù)據(jù)賦值給data_yuwen,作為新的數(shù)據(jù)源傳入畫圖函數(shù)plt.bar(),畫出來的圖自然就不一樣了。
先看一眼數(shù)據(jù)長(zhǎng)什么樣子:
根據(jù)這個(gè)數(shù)據(jù)源繪制出的圖形如下,由于用來畫圖的數(shù)據(jù)進(jìn)行了降序排序操作,所以生成條形圖的條也會(huì)進(jìn)行降序排序展示:
很多時(shí)候,我們常見的條形圖還有另一種展現(xiàn)形式,那就是橫向的條形圖,比較火的那種動(dòng)態(tài)條形圖絕大多數(shù)也都是橫向的條形圖,那么橫向的條形圖如何繪制呢?
理解plt.bar()主要參數(shù)
其實(shí)也不難,只要清楚plt.bar()函數(shù)中主要參數(shù)的作用就可以了!條形圖函數(shù)中有五個(gè)主要參數(shù),分別是x,height,width,bottom,orientation。其中x控制的是每個(gè)條在x軸上位置,height控制的是每個(gè)條的長(zhǎng)度,width控制的是每個(gè)條的寬度,bottom控制的是每個(gè)條在y軸方向的起始位置,orientation控制的是條形的方向,是縱向還是橫向,默認(rèn)是縱向的。
通過一個(gè)小例子理解下這幾個(gè)參數(shù)的作用:
上邊的幾行代碼輸出的圖形如下:
對(duì)比著代碼和實(shí)際輸出的條形圖,各個(gè)主要參數(shù)的作用是不是一目了然啦?
橫向條形圖
理解了這幾個(gè)參數(shù)作用后,縱向的條形圖轉(zhuǎn)換成橫向的條形圖就沒什么難度了!
需要設(shè)置所有條形在x軸的位置都為0,也就全部從最左側(cè)開始畫條形;由于是橫向條形圖,所以實(shí)際上條的寬度顯示的是數(shù)據(jù)大小,將width參數(shù)設(shè)置成原數(shù)據(jù)中的語文成績(jī);bottom控制每個(gè)條在y軸方向的起始位置,設(shè)置bottom=range(10)設(shè)置每個(gè)條形在y軸的起始位置各不相同避免有條形重疊;height控制的是每個(gè)條在y軸方向上的長(zhǎng)度,條形圖橫向設(shè)置后,在y軸上的長(zhǎng)度失去了衡量數(shù)據(jù)的意義,所以直接設(shè)置一個(gè)常數(shù)即可;最后設(shè)置條形的方向?yàn)闄M向,即orientation=“horizontal”。
溫馨提示:數(shù)據(jù)和標(biāo)簽一定要匹配,即plt.bar()重點(diǎn)的數(shù)據(jù)要和plt.yticks()中提取出來的標(biāo)簽一一對(duì)應(yīng),一旦不匹配,整個(gè)圖展現(xiàn)的結(jié)果就是一個(gè)錯(cuò)誤的結(jié)果!
上述代碼生成的條形圖如下:
感覺上邊這種生成橫向條形圖的方式有點(diǎn)點(diǎn)繞,和人們的習(xí)慣認(rèn)知有點(diǎn)不大一樣,難道畫一個(gè)橫向條形圖就非得轉(zhuǎn)變自己的習(xí)慣認(rèn)知這么反人類嗎?
當(dāng)然不是的,實(shí)際上有更簡(jiǎn)單的方法繪制一個(gè)橫向條形圖,之所以沒有一開始就直接用這種簡(jiǎn)單的方法,也是為了讓大家體會(huì)下條形圖參數(shù)的靈活設(shè)置而已,而且如果比較繞的方法都能理解了,簡(jiǎn)單的方法理解和運(yùn)用起來就更沒有難度了啊!
不賣關(guān)子了,我們來認(rèn)識(shí)下和plt.bar()函數(shù)類似的plt.barh()函數(shù)。
plt.barh()函數(shù)是專門繪制水平條形圖的函數(shù),主要的參數(shù)有:
y 控制y軸顯示的標(biāo)簽來源width 控制橫向條形的長(zhǎng)度,即用來進(jìn)行對(duì)比的數(shù)據(jù)源height 條形的寬度需要設(shè)置的參數(shù)主要就是這三個(gè),比用plt.bar()函數(shù)繪制水平條形圖簡(jiǎn)單了很多,具體代碼如下:
效果圖:
和用plt.bar()函數(shù)繪制的橫向條形圖一毛一樣對(duì)不對(duì)?以后有需求繪制橫向條形圖,盡量用plt.barh()函數(shù)吧,畢竟它是專門繪制這種類型圖的,簡(jiǎn)單好用。
然而實(shí)際工作中對(duì)于條形圖的需求不只是這些,比如例子中只是對(duì)各個(gè)學(xué)校語文成績(jī)的展示,有時(shí)候需要各個(gè)學(xué)科的成績(jī)同時(shí)展現(xiàn)在一幅條形圖中,有時(shí)候也需要繪制堆積條形圖對(duì)各學(xué)科的成績(jī)以及總成績(jī)進(jìn)行展示,這些圖又該如何繪制呢?其實(shí)只要理解了各個(gè)參數(shù)的含義,繪制這些圖也不在話下,至于具體怎么畫,且看下回分解啊!
當(dāng)前文章:python中bar函數(shù),bar函數(shù)用法
標(biāo)題鏈接:http://m.kartarina.com/article42/hcspec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、移動(dòng)網(wǎng)站建設(shè)、微信公眾號(hào)、域名注冊(cè)、靜態(tài)網(wǎng)站、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)