2011-12-07 45 views
6
class ClassA: pass 
mytype = type(ClassA) 

使用mytype,你如何創建一個ClassA的實例?創建一個實例,我已經有了類型

請注意,我不尋找這是我的答案:)

instance = ClassA() 

我知道,在這個例子中,這就是你需要做的,但假設你有這種類型(MYTYPE) ,你對它一無所知,你需要創建它的一個實例。

我試着只調用mytype(),它返回一個錯誤,指出該類型()需要1或3個參數。我想這些參數可能與你想要傳入正在創建的對象的init方法的任何參數有關。

注意:我已經看到一些關於如何創建一個給定一個字符串來表示其完全限定名的對象的問題。請注意,在這裏,我已經有一個類型,所以它有點不同?我認爲?

編輯...我希望我可以做以下.NET代碼相當於:

class A {} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Type type = typeof(A); 

     // Given the type, I can create a new instance 
     object new_instance = Activator.CreateInstance(type); 
    } 
} 

我曾以爲,在Python中,類(ClassA的)給了東西回來,我可以在以後使用創建ClassA的一個實例。看起來我誤解了Python中的類型。

+1

MYTYPE =類型(ClassA的)會給你一個類的對象。我懷疑這不是你的意思。 –

+0

這就是我的意思,我認爲:)如果這有助於澄清任何事情,請參閱我的.Net上面的編輯。 –

回答

14

如果使用一種新的風格類的,這將工作:

class ClassA(object): 
    pass 

o = ClassA() 
mytype = type(o) 
new_object = mytype() 
+0

這非常接近我正在尋找的東西。謝謝! –

+1

...但顯然不是如果你在'__init __()參數' – Basic

4

這個問題沒有意義。 type(X)告訴您X的類型,並且返回值不包含有關特定類X的信息,與type("abc")(即str)相同,不包含有關用作參數的字符串的信息。

除非類X具有自定義元類,否則答案將始終爲type,因爲這是python中的默認元類。在你的情況下,那麼,mytype is type,也就是說,它們是同一個對象。

您可以使用type如果你使用一個參數,或使用三個參數,你可以創建動態類來檢查對象的類型,:

myclass = type('ClassB', (object,), {"class_attribute": 3.14}) 

讓我們假設一下,如果mytype擔任你認爲它會。請記住,類型的實例是類,與類的實例是對象的方式完全相同。因此,就像(除了單例類)ClassA() is not ClassA()(每個實例是唯一的),mytype() is not mytype() - 即每次實例化類型時應該得到不同的類。所以你不會得到ClassA反正。爲了說明與代碼的時候,你可以運行:

>>> type('A', (object,), {}) == type('A', (object,), {}) 
False 

OP編輯答案

類在Python是「一等公民」,不像你在大多數編譯語言有什麼。這意味着你可以直接傳授課程;你並不需要一個typeof相當於:

>>> class A(object): pass 
... 
>>> B = A 
>>> B() 
<__main__.A object at 0xb781138c> 
>>> def print_class_name(cls): 
...  print cls.__name__ 
... 
>>> print_class_name(B) 
A 

This文章包含的typeobject和對象實例是如何連接在Python一個很好的解釋。

+0

謝謝,現在閱讀文章。 –

3

lazyr說,這是不可能與type。也許你可以使用是一樣的東西

class ClassA: pass 
myclass = ClassA 
instance = myclass() 
相關問題