:
有什么区别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