a = a()和python中的a = a之间的差异



有什么区别
class Animal(object):
   pass
a = Animal;
a.asdas = 2;
print(vars(a))

输出:

{'asdas' : 2}   

class Animal(object):
        pass
a = Animal();
a.asdas = 2;
print(vars(a))

输出:

{'asdas': 2, '__doc__': None, '__dict__': <attribute '__dict__' of 'Animal' objects>, '__weakref__': <attribute '__weakref__' of 'Animal' objects>, '__module__': '__main__'}   

为什么输出如此不同,看来a=Animal()并未创建与a=Animal相同的对象。这不是混淆吗?

从答案中清楚的是:当您来自(C/C )等编程世界时,这是非常困惑的。我期望a = Animal还将用空参数调用构造函数...

比较以下内容:

a = Animal
b = Animal()

,如果分别分别将它们打印出来,则给出:

<class '__main__.Animal'>
<__main__.Animal object at 0x108449940>

因此:第一个代表 class 动物,为什么后者是相同的实例

a=Animal不会创建任何对象。它只是将类动物分配给名称a。

进行a = Animal时,实际上是在说变量a与类(对象)Animal

相同

但是,当您进行a = Animal()时,Python实际上是在内存中创建了类Animal的实例。这意味着在内存中的特殊位置创建并引用了Animal类的新实例。此实例将表示Animal行为,但是不会是类本身。

有关此基本计算机科学问题的进一步说明,您可以检查以下问题:实例和对象之间有什么区别?

为什么会混淆?您在这里很明显地在这里做不同的事情。当您进行a = Animal()时,您将调用创建其实例的类。当您执行a = Animal时,您只是在对类本身进行另一个引用。

在python中,函数(和类)是对象,因此您可以对它们做任何事情,包括将它们分配给可变名称。

如果将()放置在功能名称之后,则您正在调用它,如果它返回任何内容,则该值将分配给左侧的变量。

如果您删除了(),则将功能本身分配给变量。当您将函数作为参数传递时,或者要为函数创建一个"别名"时,请执行此操作。

如果您执行此a = A,则可以使用a()A()调用该功能。

使用a = Animal只是说a Animal。例如:

>>> y = 1
>>> x = y
>>> print((x, y))
(1, 1)
>>> x == y
True
>>> x is y # the important part
True

它与类相同的工作:

>>> class Animal(object):
...     pass
...
>>> a = Animal
>>> print((a, Animal))
(<class '__main__.Animal'>, <class '__main__.Animal'>) # they are identical
>>> a == Animal
True
>>> a is Animal # again, the important part
True

使用a = Animal()时,您正在创建类实例并将其分配给a。例如:

>>> class Animal(object):
...     pass
...
>>> a = Animal()
>>> print((a, Animal))
(<class '__main__.Animal'>, <__main__.Animal object at 0x022BF6F0>)
>>> a == Animal
False
>>> a is Animal
False

a现在是Animal的实例,而不是Animal本身。

>>> isinstance(a, Animal)
True

最新更新