Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 创建一个实例,我已经有了类型_Python - Fatal编程技术网

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

Python 创建一个实例,我已经有了类型,python,Python,使用mytype,如何创建ClassA的实例 请注意,我不是在寻找答案:) 我知道在这个例子中,这就是你需要做的,但是假设你有这个类型(mytype),你对它一无所知,你需要创建它的一个实例 我尝试调用mytype(),它返回一个错误,指出type()接受1或3个参数。我想这些参数可能与您希望传递到所创建对象的init方法中的任何参数有关 注意:我已经看到了一些关于如何在给定一个表示其完全限定名的字符串的情况下创建对象的问题。注意,在这里,我已经有了一个类型,所以它有点不同?我想是吧 我曾希望我

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

请注意,我不是在寻找答案:)

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

我尝试调用
mytype()
,它返回一个错误,指出type()接受1或3个参数。我想这些参数可能与您希望传递到所创建对象的init方法中的任何参数有关

注意:我已经看到了一些关于如何在给定一个表示其完全限定名的字符串的情况下创建对象的问题。注意,在这里,我已经有了一个类型,所以它有点不同?我想是吧

我曾希望我可以执行以下.NET代码的等效操作:

class A{}
班级计划
{
静态void Main(字符串[]参数)
{
类型=类型(A);
//给定类型,我可以创建一个新实例
object new_instance=Activator.CreateInstance(类型);
}
}

我假设在Python中,
type(ClassA)
返回了一些东西,我可以稍后使用它们创建
ClassA
的实例。看起来我误解了Python中的类型。

这个问题毫无意义
type(X)
告诉您
X
的类型,返回值不包含有关特定类
X
的信息,同样的
type(“abc”)
,即
str
,不包含有关用作参数的字符串的信息

除非类
X
有一个自定义元类,否则答案总是
type
,因为这是python中的默认元类。在您的例子中,
mytype是type
,也就是说,它们是相同的对象

如果使用一个参数,可以使用
type
检查对象的类型;如果使用三个参数,则可以动态创建类:

instance = ClassA()
让我们假设
mytype
的工作方式与您想象的一样。请记住,类型的实例是类,与类的实例是对象的方式完全相同。因此,正如(除了单例类)
ClassA()不是ClassA()
(每个实例都是唯一的),
mytype()不是mytype()
——也就是说,每次实例化类型时都应该得到不同的类。所以你无论如何也不会得到
ClassA
了。要用您可以运行的代码说明这一点,请执行以下操作:

myclass = type('ClassB', (object,), {"class_attribute": 3.14})
操作编辑答案

python中的类是“第一类公民”,与大多数编译语言中的类不同。这意味着你可以直接把课程传给其他人;您不需要
类型的
等效项:

>>> type('A', (object,), {}) == type('A', (object,), {})
False
>>A类(对象):通过
... 
>>>B=A
>>>B()
>>>def打印类名称(cls):
...     打印cls.\u\u名称__
... 
>>>打印类别名称(B)
A.

这篇文章很好地解释了python中
类型
对象
和对象实例是如何连接的。

是lazyr说的,使用
类型
是不可能的。也许你能用的是

>>> 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

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

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

mytype=type(ClassA)将为您提供一个类对象。我怀疑这不是你的意思。这是我的意思,我想:)如果这有助于澄清任何问题,请参阅我上面的.Net示例编辑。这与我所寻找的非常接近。谢谢但是如果您在
\uuuu init\uuuu()
@Basic中有参数,那么显然不是这样:
\uuuu init\uuuu()
中的参数有什么问题?当我用类似这样的东西更新
ClassA
时:
\uuuuu init\uuuuuuuuuuuuuuuself,a,b)
,我就可以毫无问题地使用上面的例子,就像
mytype(1,2)
mytype(a=1,b=2)
class ClassA: pass
myclass = ClassA
instance = myclass()
class ClassA(object):
    pass

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