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

ClassAのインスタンスはどのように作成しますか?私はが私の答えとしてこれを見ていないインスタンスを作成しました。すでにタイプがあります

注:)

instance = ClassA() 

私はこの例では、それはあなたがいますが、このタイプ(MYTYPE)を持っていると仮定するのに必要なすべてだということを知っていますあなたはそれについて何も知らないし、そのインスタンスを作成する必要があります。

私はmytype()を呼び出してみましたが、その型()が1つまたは3つの引数を取ることを示すエラーを返します。これらの引数は、作成されるオブジェクトのinitメソッドに渡したい引数に関連していると思います。

注:完全修飾名を表す文字列を指定してオブジェクトを作成する方法については、多くの質問があります。ここでは、すでにタイプがあるので少し違うことに注意してください。おもう?私はPythonで、タイプ(A級)は、私が後で使うことができると背中に何かを与えたことを想定していた

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); 
    } 
} 

EDITは...私は、次の.NETコードの同等の操作を行うことができることを期待していました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の情報が含まれていません。はstrで、引数として使用される文字列に関する情報は含まれていません。

クラスXにカスタムメタクラスがない限り、答えは常にtypeです。これはPythonのデフォルトのメタクラスです。あなたの場合、mytype is type、つまり、それらは同じオブジェクトです。

あなたは、あなたが動的にクラスを作成することができます一つの引数、または3つの引数を使用してを使用する場合は、オブジェクトの種類を確認するために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編集ANSWER:あなたが実行可能なコードとポイントを説明するために

クラスの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記事では、どのようにtypeの優れた説明が含まれていobjectし、オブジェクトのインスタンスは、Pythonで接続されています。

+0

ありがとう、記事を今読んでください。 –

3

lazyrは言っていますが、typeではできません。新しいスタイルのクラスにそれを使用する場合はたぶん、あなたが使用できること

class ClassA: pass 
myclass = ClassA 
instance = myclass() 
関連する問題