2016-09-21 79 views
2

我是一個相對較新的Python學習者。因此,要通過不同的編碼技術,同時,我碰到這樣的:使用參數和簽名

from inspect import Parameter, Signature 

def make_signature(names): 
    return Signature(Parameter(name, Parameter.POSITIONAL_OR_KEYWORD) for name in names) 

class Structure: 
    list_fields = [] 
    def __init__(self, *args): 
     for name, val in zip(self.list_fields, args): 
      setattr(self, name, val) 

class Stock(Structure): 
    __signature__ = make_signature(['name', 'shares', 'price']) 
    #list_fields = ['name', 'shares', 'price'] 

class Point(Structure): 
    list_fields = ['x', 'y'] 

obj2=Point(20,40) 
obj1=Stock('googl', 100, 8000) 
print(obj1.name) 

我明白Structure類及其與Point類,這是繼承Structure類,因此它是__init__方法的整合。但是當我創建Point類的對象時,它不支持位置參數,但Stock類對象確實支持該功能。

  • 任何人都可以請向我解釋爲什麼&這是怎麼發生的?
  • 何時使用Parameter,Signature?
  • 這與元編程有什麼關係?
  • 更多類似的例子。
  • Parameter函數有什麼用途make_signature方法和make_signature方法在做什麼?
  • 程序的流程即哪個函數返回給誰,反之亦然。據我所知,Stock班和Point班正在呼叫Structure班,但是什麼時候make_signature方法進來?

我想讀一些有關的文件,但Signature這些例子都是這樣的,並沒有太多沉重的東西對我來說我一直迷路回溯這段代碼也單證我找不到任何好的解釋Python中元編程的文檔。

回答

2

任何人都可以請向我解釋爲什麼&這是怎麼發生的?

兩個類接受位置參數由*argsStructure.__init__決定:

s = Stock('pos_arg1', 'pos_arg2', 'pos_arg3') 
p = Point('pos_arg1', 'pos_arg2', 'pos_arg3') 

不同的是,Stock實際上並不設置任何參數,因爲,既然你註釋掉list_fieldsStructure.__init__將使用空的Structure.list_fields。這就是爲什麼在Stock實例上嘗試訪問name會產生AttributeError

在這兩種情況下,list_fields限制可以設置什麼參數。對於前面片段中的Point實例,x將等於pos_arg1,而y將等於pos_arg2; pos_arg3實質上是扔了。直到iterables之一耗盡,這是由於zip它建立的元組:

for i, j in zip(['x', 'y'], ['pos_arg1', 'pos_arg2', 'pos_arg3']): 
    print(i, j) 

打印:

x pos_arg1 
y pos_arg2 

當提供一個空列表,它甚至不循環。這是發生了什麼,當你初始化Stock,用於Structure.list_fields = []

for i, j in zip([], ['pos_arg1', 'pos_arg2', 'pos_arg3']): 
    print(i, j) 

打印什麼所以沒有setattr s的將被調用。

何時使用Parameter,Signature?

如果你想支持你的類(或者,在一般情況下可調用)的進一步的反省,你可以一個__signature__屬性添加到您的類(如與Stock完成),並把它拾起工具,如inspect.signature ,即:

inspect.signature(Stock) 
Out[16]: <Signature (name, shares, price)> 

inspect.signature(Point) 
Out[17]: <Signature (*args)> 

簽名會嘗試看看是否對象具有object.__signature__如果是這樣構建簽名的表示調用時。

此外,你可以bind簽名自我,並得到它支持POSITIONAL_OR_KEYWORD的論點。

一般情況下,這隻會在極少數情況下作爲要求呈現。簡而言之:你會知道你是否需要它。

此外,這與元編程有什麼關係?

這個具體的例子是不相關的。您可以使用元編程來增強它,就像您將在我將鏈接的演示文稿中看到的一樣。

還有一些這樣的例子。

這是太寬泛的請求。但你的例子來自大衛貝茲利的元編程演示,here's the presentation

據我所知Stock函數和Point函數調用Structure類,但make_signature方法在哪裏?

兩個StockPoint使用Structure.__init__這將填充在list_fields定義的屬性的實例字典。

__signature__ = make_signature([...])正在執行當創建類時,Python在遇到它時執行class的主體。 make_signature將被調用,並創建一個Signature對象,並將分配到__signature__即將完成。

+0

您能否介紹一下make_signature方法中的Parameter函數和make_signature方法的用途是什麼?你還可以告訴我程序的流程,即哪個功能返回給誰,反之亦然。 – BlackBeard

+0

更新了我的回答@NiladriSekharBasu。注意你的問題已經是5個問題了,你不能不斷更新它來請求更多的信息;這就是*新問題。 –