python中a=a()和a=a的区别
这两者之间有什么区别python中a=a()和a=a的区别,python,python-3.x,Python,Python 3.x,这两者之间有什么区别 class Animal(object): pass a = Animal; a.asdas = 2; print(vars(a)) 输出: {'asdas' : 2} {'asdas': 2, '__doc__': None, '__dict__': <attribute '__dict__' of 'Animal' objects>, '__weakref__': <attribute '__weakref__' of 'Animal
class Animal(object):
pass
a = Animal;
a.asdas = 2;
print(vars(a))
输出:
{'asdas' : 2}
{'asdas': 2, '__doc__': None, '__dict__': <attribute '__dict__' of 'Animal' objects>, '__weakref__': <attribute '__weakref__' of 'Animal' objects>, '__module__': '__main__'}
及
输出:
{'asdas' : 2}
{'asdas': 2, '__doc__': None, '__dict__': <attribute '__dict__' of 'Animal' objects>, '__weakref__': <attribute '__weakref__' of 'Animal' objects>, '__module__': '__main__'}
{'asdas':2','uuuuu doc':None','uuuu dict':,'uuuuuu weakref':,'uuuuuu module':'uuuuu main'}
为什么输出如此不同,似乎a=Animal()
没有创建与a=Animal
相同的对象。这不让人困惑吗
从回答中,以下内容变得清晰:
当您来自(C/C++)这样的编程世界时,会感到非常困惑。
我希望
a=Animal
也使用空参数调用构造函数…a=Animal
不会创建任何对象。它只是将类Animal指定给名称a 为什么让人困惑?很明显,你们在这里做着不同的事情。当您执行a=Animal()
时,将调用创建其实例的类。当您执行a=Animal
时,您只是对类本身进行了另一次引用。比较以下内容:
a = Animal
b = Animal()
如果将它们分别打印出来,则会给出:
<class '__main__.Animal'>
<__main__.Animal object at 0x108449940>
因此:第一个代表类Animal,为什么后者是相同的实例。当你做
a=Animal
时,你实际上是说变量a
与类(对象)Animal
相同
但是当您执行a=Animal()
时,Python实际上是在内存中创建类Animal
的实例。这意味着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'>, <__main__.Animal object at 0x022BF6F0>)
>>> a == Animal
False
>>> a is Animal
False
它对类的作用也是一样的:
>>> 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
的实例,而不是Animal
本身
>>> isinstance(a, Animal)
True
您是否尝试查看类型(a)
?。因此A()
和A
是不同的东西。A=Animal
不会创建任何对象。它只是说< <代码> A/CUT>变量引用指向与<代码>动物< /代码>类相同的内存位置。为什么要投票,作为C++程序员,这只是粗略的:因为A=动物通常只调用默认的CtoR,Python世界中绝对没有这样做。从中学到的东西(仍然困惑)我没有否决,但我希望用其他语言编程的人能够阅读他正在使用的一种新编程语言的文档。如果所有的语言都是一样的,为什么我们需要它们呢?我认为,考虑到混乱情况,更好地谈论实例比uuObject更正确,即使你理解得很好,你也可以扩展使用对象作为实例。为什么你想引用类本身呢。这甚至在记忆中吗?在其他语言中,只有一个实例是在堆上创建的,在某些地方我们可以使用它,但是为什么您应该能够使用类本身呢???我想这就是我不太理解python的地方。Python解析文件并在某个地方创建定义,这些定义也可以访问,比如“a=Animal”?这是否正确?a=Animal
不会创建任何新引用,它只是使a
变量指针指向与Animal
类相同的位置。所以,你认为没有赢家,好吧,有可能。如果您的类被命名为superlongClassNameBecauseInOntKnowHowtOnNameClasses
,那么命令ShortName=superlongClassNameBecauseInOntKnowHowtOnNameClasses
将允许您使用较短的名称调用该类。这实际上就是当您将numpy作为np导入时发生的情况。您只是说import numpy
,然后再说np=numpy
,以获得一个较短的名称。我现在无法想象一个简单的示例,您会对使用类本身感兴趣,但我想有时您可能需要它。如果您有一个类列表,其中每个类都有一个静态方法same\u method()
,那么您可以对类内列表执行:a.same\u method()
。那里有一个
将引用其他每一个类。这是一个愚蠢的例子,但我想你可以有类似的例子。关于问题的第二部分,我不知道Python是如何处理内存的,但这不是一个关于Python的问题,更一般。