2011-12-07 46 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() 
相关问题