2017-05-11 38 views
0

這條線在python中做了什麼?Instance()在Python中做什麼?

user_magics = Instance('IPython.core.magics.UserMagics', allow_none=True) 

注意UserMagicsIPython.core.magics.__init__.py像這樣定義一個空類:

@magics_class 
class UserMagics(Magics): 
    """Placeholder for user-defined magics to be added at runtime. 

是什麼上面,這定義之間的區別?

user_magics = UserMagics() 

注意下面的Blender指出,這是trailets包的一部分,而不是基於Python。

+1

'Instance'不是Python的一部分。 –

+0

它記錄在'traitlets'包中:https://traitlets.readthedocs.io/en/stable/trait_types.html#classes-and-instances – Blender

回答

1

Instancetraitlets package的一部分。從文檔:

總之,traitlets讓用戶定義具有

  1. 屬性(特徵)與類型檢查和動態計算的默認值
  2. 性狀發出變化事件的類時的屬性被修改
  3. Traitlets執行一些驗證並允許強制分配新的特徵值。它們還允許用戶基於其他 屬性的值爲屬性定義自定義 驗證邏輯。

下面是具體使用Instance的包做什麼的例子,:

from traitlets import HasTraits, Int, Instance 

class Foo(object): 
    pass 

class MyObject(HasTraits): 
    num = Int() 
    foo = Instance(Foo, allow_none=True) 

if __name__ == '__main__': 
    # works 
    a = MyObject() 
    a.num = 10 
    a.foo = Foo() 

    # works 
    b = MyObject() 
    b.num = 5 
    b.foo = None 

    # breaks 
    c = MyObject() 
    c.num = -1 
    c.foo = object() # The 'foo' trait of a MyObject instance must be a Foo or None, but a value of type 'object' was specified. 
+0

正是我所期待的,謝謝Blender!更新問題的標籤以包含traitlets。 –