Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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中a=a()和a=a的区别_Python_Python 3.x - Fatal编程技术网

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的问题,更一般。