從腳本編寫到面向?qū)ο蟮腜ython編程

Python 在近年來的受歡迎程度劇增揭措,部分原因在于該語言非常靈活渐扮,同時(shí)功能非常強(qiáng)大时肿。Python 可用于系統(tǒng)管理央星、Web 開發(fā)、GUI 編程矿瘦、科學(xué)計(jì)算等等浙于。本文的主要目標(biāo)是向習(xí)慣于使用 Bash帘撰、PHP 或其它某種語言編寫腳本過程代碼的人介紹面向?qū)ο蟮?Python 開發(fā)洪囤,并幫助他們轉(zhuǎn)換到面向?qū)ο蟮?Python 開發(fā)徒坡。Python 的這種日益流行性意味著,對(duì)于目前使用其他編程語言的開發(fā)人員瘤缩,除了使用他們最喜歡的語言之外喇完,他們還可以采用 Python 來完成某些項(xiàng)目。

過程式編程當(dāng)然有其用武之地剥啤,并且可能是解決某個(gè)問題的高度有效的方法锦溪。在非巢桓基本的層次上,過程式編程可定義為指令的列表刻诊,Bash 和 PHP 通常就是以這樣的方式編寫的防楷。然而由于 Python 的流行,對(duì)于作為 Web 開發(fā)人員或系統(tǒng)管理員的 PHP 和 Bash 腳本編寫人員坏逢,他們正陷入必須同時(shí)學(xué)習(xí)面向?qū)ο蟮木幊毯?Python 的境地域帐。

面向?qū)ο筮@個(gè)概念很難一次性地掌握,因此本文采用過程式 Bash 和 PHP 腳本是整,并首先將它們轉(zhuǎn)換為過程式 Python。作為最后一步民假,它們將轉(zhuǎn)換為面向?qū)ο蟮?Python 這個(gè)終結(jié)目標(biāo)浮入。本文在結(jié)束時(shí)將簡(jiǎn)略討論一下面向?qū)ο蟮?Python 的一些優(yōu)點(diǎn),然后在最后討論一些可能更適合采用過程或函數(shù)式編程的一些不利場(chǎng)景羊异。到本文結(jié)束時(shí)事秀,Bash 或 PHP 程序員應(yīng)該能夠毫無畏懼地一頭扎進(jìn)面向?qū)ο蟮?Python 項(xiàng)目。

采用 PHP 和 Bash 編寫磁盤監(jiān)視函數(shù)

雖然 PHP 主要是為了在瀏覽器中運(yùn)行野舶,但是也可以通過 exec 函數(shù)執(zhí)行系統(tǒng)調(diào)用易迹。采用 PHP 編寫的第一個(gè)示例將捕獲 Shell 命令“df –h”的輸出,將輸出放在一個(gè)數(shù)組中平道,然后根據(jù)一個(gè)正則表達(dá)式檢查輸出的每一行睹欲。如果該行與正則表達(dá)式匹配,則打印該行一屋。如果您希望從主目錄運(yùn)行此示例窘疮,只需將此腳本命名為 index.php,并將其放在 Apache/mod_php 服務(wù)器的對(duì)外服務(wù)目錄中冀墨。

PHP 磁盤監(jiān)視示例


//Analyzes disk usage

//Takes regex pattern and message

function disk_space( $pattern="/2[0-9]%/", $message="CAPACITY WARNING:" )

{

exec(escapeshellcmd("df -h"),$output_lines,$return_value);

foreach ($output_lines as $output) {

if (preg_match( $pattern, $output ))

echo "$message $output

";

}

}

disk_space()

?>

復(fù)制代碼

如果您在瀏覽器中運(yùn)行此網(wǎng)頁(yè)闸衫,將會(huì)獲得以下結(jié)果:

CAPACITY WARNING: /dev/sda1 3.8G 694M 2.9G 20% /

查看該代碼,可以看到正則表達(dá)式模式被設(shè)置為匹配某個(gè)包含 20-29% 的行诽嘉∥党觯可以容易地修改此模式以適應(yīng)其他標(biāo)志,例如 90-99%虫腋,因?yàn)?20% 是非常低的磁盤容量骄酗。

下面讓我們看一下如何在 Bash 函數(shù)中完成同樣的事情。在 Bash 中岔乔,該問題要容易解決得多酥筝,因?yàn)槟鷮?shí)際上是在處理系統(tǒng)調(diào)用。在此示例中雏门,您甚至不需要使用數(shù)組或正則表達(dá)式庫(kù)嘿歌,因?yàn)槭褂玫?grep 的管道容易多了掸掏。不過,在 Bash 中設(shè)置函數(shù)的缺省參數(shù)始終有點(diǎn)麻煩宙帝。

Bash 磁盤監(jiān)視示例

#!/usr/bin/env bash

#function flags disk usage takes pattern and message optionally

function disk_space ()

{

#checks for pattern parameter

if [ "$1" != "" ]; then

pattern=$1

else

pattern="2[0-9]%"

fi

#checks for message parameter

if [ "$2" != "" ]; then

message=$2

else

message="CAPACITY WARNING:"

fi

#looks at output for pattern to flag

output_lines=`df -h | grep $pattern`

if [ "$output_lines" != "" ]; then

echo $message $output_lines

fi

}

#example of optional parameters usage

#disk_space 9[0-9]% ALERT:

disk_space

復(fù)制代碼

當(dāng)您運(yùn)行此腳本時(shí)丧凤,將會(huì)獲得同樣的輸出,因此可以跳過輸出的顯示步脓。您能夠從該腳本的 PHP 版本和 Bash 版本中找到的相關(guān)性在于愿待,此過程式代碼事實(shí)上像一組指令一樣運(yùn)行。似乎計(jì)算機(jī)就像是一個(gè)小孩靴患,而您告訴該小孩如何做某件事情仍侥,例如第一次系鞋帶。在您開始在 Python 中考慮“面向?qū)ο蠓妒健敝霸Ь屛覀兪紫瓤匆幌氯绾尾捎?Python 來創(chuàng)建這同一個(gè)腳本的過程式版本农渊。

Python 磁盤監(jiān)視示例

from subprocess import Popen, PIPE

import re

def disk_space(pattern="2[0-9]%", message="CAPACITY WARNING:"):

#takes shell command output

ps = Popen("df -h", shell=True,stdout=PIPE, stderr=PIPE)

output_lines = ps.stdout.readlines()

for line in output_lines():

line = line.strip()

if re.search(pattern,line):

print "%s %s" % (message,line)

disk_space()

復(fù)制代碼

瀏覽一下我們的代碼的過程式 Python 版本,發(fā)現(xiàn)它與 Bash 和 PHP 版本非常相似或颊。對(duì)于 Python砸紊,子過程模塊處理對(duì) Shell 命令的系統(tǒng)調(diào)用,并將輸出發(fā)在一個(gè)列表(在 Bash 和 PHP 中稱為數(shù)組)中囱挑。與 PHP 版本非常相似醉顽,然后我對(duì)命令的標(biāo)準(zhǔn)輸出行列表中的項(xiàng)進(jìn)行了迭代遍歷。我尋找構(gòu)成所尋找模式的正則表達(dá)式平挑,然后使用注入的特殊消息來打印該磁盤報(bào)告行游添。這是如何解決自頂向下的腳本問題的經(jīng)典示例,但是在下一個(gè)部分中弹惦,您將完全改變這種方法否淤,并從對(duì)象的角度考慮問題。

從過程到面向?qū)ο蟮?Python

過程式編程通常是初學(xué)的開發(fā)人員的最自然編程風(fēng)格棠隐,并且對(duì)于許多問題來說也是高度有效的石抡。另一方面,對(duì)于創(chuàng)建抽象從而創(chuàng)建可重用的代碼來說助泽,面向?qū)ο蟮木幊炭赡苁欠浅S杏玫姆椒▎浮H欢?dāng)項(xiàng)目達(dá)到某種程度的復(fù)雜性之后嗡贺,過程代碼通常會(huì)暴露出其根本缺陷隐解。下面讓我們直接進(jìn)入上一個(gè)示例的面向?qū)ο蟀姹荆⒖纯催@樣有何變化诫睬。

面向?qū)ο蟮?Python 磁盤監(jiān)視腳本

#!/usr/bin/env python

from subprocess import Popen, PIPE

import re

class DiskMonitor():

"""Disk Monitoring Class"""

def __init__(self,

pattern="2[0-9]%",

message="CAPACITY WARNING",

cmd = "df -h"):

self.pattern = pattern

self.message = message

self.cmd = cmd

def disk_space(self):

"""Disk space capacity flag method"""

ps = Popen(self.cmd, shell=True,stdout=PIPE,stderr=PIPE)

output_lines = ps.stdout.readlines()

for line in output_lines:

line = line.strip()

if re.search(self.pattern,line):

print "%s %s" % (self.message,line)

if __name__ == "__main__":

d = DiskMonitor()

d.disk_space()

復(fù)制代碼

查看該代碼的面向?qū)ο蟀姹旧访#梢钥吹酱a變得更加抽象。有時(shí),太多的抽象會(huì)導(dǎo)致設(shè)計(jì)問題续徽,但是在此例中蚓曼,它允許您將問題分離為更多可重用的部分。 DiskMonitor 類具有 __init__ method钦扭,您可以在其中定義新的參數(shù)纫版,并且 disk_space 函數(shù)現(xiàn)在是該類中的一個(gè)方法。

使用這種新的樣式客情,您無需更改原始代碼即可容易地重用和自定義各個(gè)部分其弊,而使用過程代碼時(shí)則通常必須更改原始代碼。面向?qū)ο蟮脑O(shè)計(jì)的一個(gè)更加功能強(qiáng)大膀斋、通常也被過度使用的方面是繼承梭伐。繼承允許您在新的類中重用和自定義現(xiàn)有的代碼。讓我們?cè)谙乱粋€(gè)示例中看看繼承可能像什么樣子概页。

使用繼承的面向?qū)ο?Python 磁盤監(jiān)視腳本

#!/usr/bin/env python

from subprocess import Popen, PIPE

import re

class DiskMonitor():

"""Disk Monitoring Class"""

def __init__(self,

pattern="2[0-9]%",

message="CAPACITY WARNING",

cmd = "df -h"):

self.pattern = pattern

self.message = message

self.cmd = cmd

def disk_space(self):

"""Disk space capacity flag method"""

ps = Popen(self.cmd, shell=True,stdout=PIPE,stderr=PIPE)

output_lines = ps.stdout.readlines()

for line in output_lines:

line = line.strip()

if re.search(self.pattern,line):

print "%s %s" % (self.message,line)

class MyDiskMonitor(DiskMonitor):

"""Customized Disk Monitoring Class"""

def disk_space(self):

ps = Popen(self.cmd, shell=True,stdout=PIPE,stderr=PIPE)

print "RAW DISK REPORT:"

print ps.stdout.read()

if __name__ == "__main__":

d = MyDiskMonitor()

d.disk_space()

復(fù)制代碼

如果運(yùn)行這個(gè)使用繼承的腳本版本籽御,您將獲得以下輸出:

RAW DISK REPORT:

Filesystem? ?? ?? ?? ?Size??Used Avail Use% Mounted on

/dev/sda1? ?? ?? ?? ? 3.8G??694M??2.9G??20% /

varrun? ?? ?? ?? ?? ? 252M? ?48K??252M? ?1% /var/run

varlock? ?? ?? ?? ?? ?252M? ???0??252M? ?0% /var/lock

udev? ?? ?? ?? ?? ?? ?252M? ?52K??252M? ?1% /dev

devshm? ?? ?? ?? ?? ? 252M? ???0??252M? ?0% /dev/shm

此輸出與前面帶標(biāo)記的版本區(qū)別非常大,因?yàn)樗皇鞘褂庙敳孔⑷氲?print 語句來打印的未經(jīng)篩選的 df –h 命令結(jié)果惰匙。通過重寫 MyDiskMonitor 類中的方法,您能夠完全改變 disk_space 方法的意圖铃将。

允許您重用其他類中的屬性的 Python 魔法是這個(gè)“MyDiskMonitor(DiskMonitor)”語句项鬼。您只需在定義新類的名稱時(shí),將先前的類的名稱放在括號(hào)內(nèi)劲阎。一旦完成此步驟绘盟,您立即可以訪問其他類屬性來做自己希望的事情。但是樂趣不僅于此悯仙。通過添加另一個(gè)通過電子郵件來發(fā)送標(biāo)記消息的方法龄毡,也許是將其命名為 disk_alert(self),這樣就可以進(jìn)一步自定義新類锡垄。這是面向?qū)ο蟮脑O(shè)計(jì)的美妙之處沦零;它允許有經(jīng)驗(yàn)的開發(fā)人員不斷重用已編寫的代碼,從而節(jié)省大量的時(shí)間货岭。

遺憾的是路操,面向?qū)ο蟮木幊桃灿衅洳焕囊幻妗K羞@些抽象都是以復(fù)雜性為代價(jià)的千贯,如果抽象過度屯仗,可能會(huì)徹底地弄巧成拙。由于 Python 支持多重繼承搔谴,抽象可以達(dá)到相當(dāng)有害的復(fù)雜程度魁袜。您是否能夠想象只是為了編寫一個(gè)方法也要查看多個(gè)文件的情況?無論相信與否,這種情況的確會(huì)發(fā)生峰弹,并且代表了面向?qū)ο缶幊痰牟恍椰F(xiàn)實(shí)店量。

面向?qū)ο蟮木幊痰奶娲桨甘呛瘮?shù)式編程,并且 Python 提供了用于進(jìn)行函數(shù)式以及面向?qū)ο蠛瓦^程式編程的資源垮卓。在最后一個(gè)示例中垫桂,我們將研究如何以函數(shù)式的方式編寫現(xiàn)已變得非常無聊的磁盤監(jiān)視代碼。

函數(shù)式的 Python 磁盤監(jiān)視腳本

from subprocess import Popen, PIPE

import re

def disk_space(pattern="2[0-9]%", message="CAPACITY WARNING:"):

#Generator Pipeline To Search For Critical Items

ps = Popen("df -h", shell=True,stdout=PIPE, stderr=PIPE)

outline = (line.split() for line in ps.stdout)

flag = (" ".join(row) for row in outline if re.search(pattern, row[-2]))

for line in flag:

print "%s %s" % (message,line)

disk_space()

復(fù)制代碼

查看這最后一個(gè)示例粟按,它與您從本文中看到的所有其他代碼的區(qū)別都非常大诬滩。如果您逐行瀏覽該代碼,可以首先從 “ps”變量中以前未見過的內(nèi)容開始灭将。接下來的兩行代碼使用生成器表達(dá)式來處理文件對(duì)象 ps.stdout疼鸟,分析該文件并在其中搜索您正在查找的行。如果您將這些代碼行剪切并粘貼到交互式的 Python Shell 中庙曙,如果打印的話空镜,您將看到概要和標(biāo)志都是生成器對(duì)象。生成器對(duì)象附帶有下一個(gè)方法捌朴,因而允許您通過“管道”將操作連在一起吴攒。

概要行從一行中去除新行字符,并往下將該行傳遞給下一個(gè)生成器表達(dá)式砂蔽,后者一次一個(gè)地在每行中搜索某個(gè)正則表達(dá)式匹配項(xiàng)洼怔,然后將輸出傳遞給標(biāo)記。此類緊湊的工作流可以替代面向?qū)ο蟮木幊虡邮阶蠹荩⑶蚁喈?dāng)有趣镣隶。然而,這種樣式也有缺點(diǎn)诡右,因?yàn)榇a的簡(jiǎn)潔性會(huì)導(dǎo)致難于調(diào)試的錯(cuò)誤安岂,除非獨(dú)立地執(zhí)行每一行代碼。函數(shù)式編程還很傷腦筋帆吻,因?yàn)樗屇ㄟ^將解決方案鏈接在一起來考慮解決問題域那。無論是從過程式還是從面向?qū)ο髽邮降慕嵌瓤矗@都是相當(dāng)不同的桅锄。

總結(jié)

本文有點(diǎn)試驗(yàn)性質(zhì)琉雳,因?yàn)樗鼜?Bash 和 PHP 談到了過程、面向?qū)ο笥蚜觯⒃谧詈笳劦搅耸褂孟嗤敬a的函數(shù)式 Python翠肘。但愿本文說明了 Python 是一種非常靈活和功能強(qiáng)大的語言,其他編程語言的開發(fā)人員也可以學(xué)習(xí)欣賞辫秧。隨著 Python 的越來越流行束倍,其他開發(fā)人員除了首選語言之外,學(xué)習(xí) Python 也將變得更加重要。

Python 最近的兩個(gè)最大的發(fā)展領(lǐng)域是 Web 開發(fā)和系統(tǒng)管理绪妹。就 Web 開發(fā)而言甥桂,PHP 開發(fā)人員可能很快就必須做出每周的選擇,即哪個(gè)項(xiàng)目采用 Python 更有意義邮旷,以及哪個(gè)項(xiàng)目采用 PHP 更有意義黄选。對(duì)于系統(tǒng)管理員、Bash 和 Perl 腳本程序員婶肩,他們經(jīng)常被要求采用 Python 完成某些項(xiàng)目办陷。部分是因?yàn)檫@是沒有選擇的,部分是因?yàn)樵S多供應(yīng)商正在為他們的產(chǎn)品提供 Python API律歼。在您的工具箱中準(zhǔn)備一點(diǎn) Python 決不會(huì)傷害任何人民镜。學(xué)好python你需要一個(gè)良好的環(huán)境,一個(gè)優(yōu)質(zhì)的開發(fā)交流群险毁,群里都是那種相互幫助的人才是可以的制圈,我有建立一個(gè)python學(xué)習(xí)交流群,在群里我們相互幫助畔况,相互關(guān)心鲸鹦,相互分享內(nèi)容,這樣出問題幫助你的人就比較多跷跪,群號(hào)是301亥鬓,還有056,最后是051域庇,這樣就可以找到大神聚合的群,如果你只愿意別人幫助你覆积,不愿意分享或者幫助別人听皿,那就請(qǐng)不要加了,你把你會(huì)的告訴別人這是一種分享宽档。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尉姨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子吗冤,更是在濱河造成了極大的恐慌又厉,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件椎瘟,死亡現(xiàn)場(chǎng)離奇詭異覆致,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)肺蔚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門煌妈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事璧诵√” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵之宿,是天一觀的道長(zhǎng)族操。 經(jīng)常有香客問我,道長(zhǎng)比被,這世上最難降的妖魔是什么色难? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮姐赡,結(jié)果婚禮上莱预,老公的妹妹穿的比我還像新娘。我一直安慰自己项滑,他們只是感情好依沮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著枪狂,像睡著了一般危喉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上州疾,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天辜限,我揣著相機(jī)與錄音,去河邊找鬼严蓖。 笑死薄嫡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的颗胡。 我是一名探鬼主播毫深,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼毒姨!你這毒婦竟也來了哑蔫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤弧呐,失蹤者是張志新(化名)和其女友劉穎闸迷,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俘枫,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腥沽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了崩哩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巡球。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡言沐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出酣栈,到底是詐尸還是另有隱情险胰,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布矿筝,位于F島的核電站起便,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏窖维。R本人自食惡果不足惜榆综,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铸史。 院中可真熱鬧鼻疮,春花似錦、人聲如沸琳轿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽崭篡。三九已至挪哄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間琉闪,已是汗流浹背迹炼。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颠毙,地道東北人斯入。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蛀蜜,于是被迫代替她去往敵國(guó)和親咱扣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理涵防,服務(wù)發(fā)現(xiàn),斷路器沪铭,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • 1.創(chuàng)建文件夾 !/bin/sh mkdir -m 777 "%%1" 2.創(chuàng)建文件 !/bin/sh touch...
    BigJeffWang閱讀 10,057評(píng)論 3 53
  • 背景: 閱讀新聞 12C CDB模式下RMAN備份與恢復(fù) [日期:2016-11-29] 來源:Linux社區(qū) 作...
    陽屯okyepd閱讀 3,403評(píng)論 0 7
  • 陽臺(tái)的花盆杀怠,還空著一個(gè)椰憋。 怪可惜的,思量著養(yǎng)點(diǎn)植物放在里面赔退。嬌嫩的花卉養(yǎng)不起橙依,也養(yǎng)不活证舟,見著小區(qū)的荒地上,長(zhǎng)著不少...
    周世恩閱讀 2,168評(píng)論 1 10
  • 你是不是很想遇見一位高人可以教你寫作呢窗骑? 1. 寫作就是一次與高人的走心交流女责。 為什么不說閱讀是一次高人交流呢? ...
    燁然v閱讀 935評(píng)論 6 20