由swift想到的 python反射機制

2021-06-28 03:16:25 字數 3181 閱讀 6247

在swift中的命令設定並沒有進行字串的定義,而是使用了python的反射機制,也即,命令引數,是manager類中的函式名稱,先我們將用到的函式列舉如下,

函式command函式,是管理服務,也是直接進行命令下發的類,manager中的成員有的是命令執行函式,而有的則不是,那麼就需要進行區分,這裡我們使用的是@command進行區分的,使用@command宣告的函式就是命令執行函式,同時其函式名稱也是命令引數

def command(func):

"""decorator to declare which methods are accessible as commands, commands

always return 1 or 0, where 0 should indicate success.

:param func: function to make public

"""func.publicly_accessible = true

@functools.wraps(func)

rv = func(*a, **kw)

return 1 if rv else 0

manager相關函式如下

class manager(object):

@command

def status(self, **kwargs):

"""display status of tracked pids for server

"""status = 0

for server in self.servers:

status += server.status(**kwargs)

return status

@command

def start(self, **kwargs):

"""starts a server

"""setup_env()

status = 0

for server in self.servers:

server.launch(**kwargs)

if not kwargs.get('daemon', true):

for server in self.servers:

try:

status += server.interact(**kwargs)

except keyboardinterrupt:

print _('\nuser quit')

self.stop(**kwargs)

break

elif kwargs.get('wait', true):

for server in self.servers:

status += server.wait(**kwargs)

return status

... def list_commands(cls):

#返回一系列可以作為命令的函式的字串,三個雙引號,表示三個雙引號之間的內容都是乙個

"""get all publicly accessible commands

:returns: a list of string tuples (cmd, help), the method names who are

decorated as commands

"""get_method = lambda cmd: getattr(cls, cmd)#lambda匿名函式,定義了乙個變數get_method,引數是cmd,直接呼叫getattr

return sorted([(x.replace('_', '-'), get_method(x).__doc__.strip())

#遍歷manager物件的成員,如果成員又屬性'publicly_accessible',該屬性是在@command 中進行定義的而後面的for...語句,則是sort自定義的

#過濾執行體,符合條件的才會加入。則返回該成員,如果沒有,則返回false,對於符合條件的成員則獲得乙個鍵值對,乙個是名稱如"start"乙個是描述

for x in dir(cls) if

getattr(get_method(x), 'publicly_accessible', false)])#

import functools

def command(func):

func.publicly_accessible = true

@functools.wraps(func)

rv = func(*a, **kw)

return 1 if rv else 0

class manager():

"dasda"

@command

def status(self, **kwargs):

'miaoshustatus'

print 'status'

def start(self, **kwargs):

'miaoshustart'

print 'start'

def no_wait(self, **kwargs):

'miaoshunowait'

print 'no_wait'

def no_daemon(self, **kwargs):

'miaoshuno_daemon'

print 'no_daemon'

@classmethod

def list_commands(cls):

print getattr(getattr(cls,'status'),"publicly_accessible",false)

get_method = lambda cmd: getattr(cls, cmd)#lambda匿名函式,定義了乙個變數get_method,引數是cmd,直接呼叫getattr

return sorted([(x.replace('_', '-'), get_method(x).__doc__.strip())

for x in dir(cls) if

getattr(get_method(x), 'publicly_accessible', false)])

print manager.list_commands()

上述**可以直接執行,這樣我們就可以理解命令引數的問題了...

由PageRank想到的

首先來看看什麼是pagerank pagerank 技術 通過對由超過 50,000 萬個變數和 20 億個詞彙組成的方程進行計算,pagerank 能夠對網頁的重要性做出客觀的評價。pagerank 並不計算直接鏈結的數量,而是將從網頁 a 指向網頁 b 的鏈結解釋為由網頁 a 對網頁 b 所投的...

由Cannot find file 想到的

記錄一下 今天除錯程式,單步真機除錯,我日,程式一步一步走,盡然和程式根本就對不上號。特別奇怪。思考一下,應該是工程太多太雜,自己有不小心,讓它們混在一起打架了。於是繼續,把其它所有工程都關了,只開啟乙個,清理了所有工程。與此工程有關的直接搜尋清理,一直以來覺得沒有必要,但這次是為了保險起見。編譯工...

由VBA想到的

這段時間由於工作原因研究了一下 vba,感覺完全是如墜五里霧中,主要原因是對 atl乃至對 com技術的應用不了解。簡單說一下 vba,用過 office 系列軟體的朋友都知道它,用 vb語法來控制文件生成過程,很不錯。不只是 office,很多其它優秀軟體都有 vba模組,比如 autocad 這...