创建一个实例,我已经有了这个类型

时间:2011-12-07 19:22:18

标签: python

class ClassA: pass
mytype = type(ClassA)

使用mytype,如何创建ClassA实例?

请注意,我 NOT 正在寻找这个作为我的答案:)

instance = ClassA()

我知道在这个例子中,你需要做的只是假设你有这种类型(mytype),你对它一无所知,你需要创建它的实例。

我尝试调用mytype()并返回一个错误,指出type()需要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中的类型。

3 个答案:

答案 0 :(得分:22)

如果您使用新的样式类,它将起作用:

class ClassA(object):
    pass

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

答案 1 :(得分:4)

这个问题毫无意义。 type(X)告诉您X的类型,并且返回值不包含有关特定类X的信息,方式type("abc")strX ,不包含有关用作参数的字符串的信息。

除非类type具有自定义元类,否则答案将始终为mytype is type,因为这是python中的默认元类。在你的情况下,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 。为了说明您可以运行代码的要点:

typeof

OP EDIT ANSWER

python中的类是“一等公民”,与大多数编译语言中的类不同。这意味着你可以直接传递课程;你不需要>>> 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 等价物:

type

This文章详细解释了如何在python中连接object,{{1}}和对象实例。

答案 2 :(得分:3)

lazyr说,type是不可能的。也许您可以使用的是

class ClassA: pass
myclass = ClassA
instance = myclass()