繁体   English   中英

Python类作为对象

[英]Python class as object

我想知道下面的类是否在一个定义的时刻成为一个对象,或者在我实例化它的那一刻它是否成为对象?

class BlaBlaCar(object):
    def __init__(self):
        pass
    def bla(self):
        pass

blabla = BlaBlaCar()

所以,blabla是一个对象。 问题是:BlaBlaCar类是否也是一个对象,所以当我不调用它时它是一个自己的对象? 当它被定义为'class BlaBlaCar(object)'时它是否作为对象存在于内存中?

编辑:当我这样做时,我很清楚:

print(BlaBlaCar())然后我实例化类对象。

问题是当我创建类体定义时,我是否创建了对象?

我同意@jonrsharpe的评论,我想你可以在这里找到你需要的所有信息。 Python中几乎所有东西都是Object。 我也查了一些参考文献。

这里,在Python Docs中,它声明:

类定义语法最简单的类定义形式如下所示:

class ClassName:
    <statement-1>
     .
     .
     .
    <statement-N>

类定义,如函数定义(def语句)必须在它们产生任何影响之前执行。 (您可以想象将类定义放在if语句的分支中,或者放在函数内部。)

实际上,类定义中的语句通常是函数定义,但其他语句是允许的,有时也很有用 - 我们稍后会再回过头来讨论它。 类中的函数定义通常具有一种特殊形式的参数列表,由方法的调用约定决定 - 再次,这将在后面解释。

输入类定义时,将创建一个新的命名空间,并将其用作本地范围 - 因此,对局部变量的所有赋值都将进入此新命名空间。 特别是,函数定义在此处绑定新函数的名称。

正常保留类定义(通过结尾)时,会创建一个类对象 这基本上是类定义创建的命名空间内容的包装器; 我们将在下一节中详细了解类对象。 恢复原始本地范围(在输入类定义之前生效的范围),并且类对象在此绑定到类定义标头中给出的类名(示例中为ClassName)。

从中你可以看出,类的纯粹定义是一个对象。

在这里,我可以找到有关对象的信息:

2.4.2。 什么是对象? Python中的所有东西都是一个对象,几乎所有东西都有属性和方法。 所有函数都有一个内置属性doc ,它返回函数源代码中定义的doc字符串。 sys模块是一个对象,其中包含一个名为path的属性(除其他外)。 等等。

不过,这引出了一个问题。 什么是对象? 不同的编程语言以不同的方式定义“对象”。 在某些情况下,这意味着所有对象必须具有属性和方法; 在其他情况下,这意味着所有对象都是可子类化的。 在Python中,定义更宽松; 一些对象既没有属性也没有方法(第3章中有更多内容),并且并非所有对象都是可子类化的(在第5章中有更多内容)。 但是在某种意义上,一切都是一个对象,它可以被赋值给一个变量或作为一个参数传递给一个函数(在第4章中更多)。

这非常重要,如果你错过了前几次我会重复它:Python中的所有内容都是一个对象。 字符串是对象。 列表是对象。 功能是对象。 甚至模块都是对象

但请注意,在以下情况下,不会使用类定义创建实例:

blabla = BlaBlaCar()

正如其他地方所指出的,Python中几乎所有东西都是对象。 但是,我觉得你的问题

问题是当我创建类体定义时,我是否创建了对象?

尚未直接解决。

当Python执行类的定义时,是的,创建了一个对象。 但重要的是要注意到这一点

  1. 创建的对象(类本身)是type的实例。
  2. 此时没有创建类的实例(在您的示例中为BlaBlaCar )。

首先,为了消除任何疑问,类定义确实为您提供了一个表示类本身(而不是实例)的对象:

>>> class BlaBlaCar(object):
...     pass
...
>>> id(BlaBlaCar) 
57088312L

所以你看到BlaBlaCar是内存中的一个对象。

你问,“创建的类对象在哪里?”

类定义通常位于模块中(或者在上面的示例中,在当前命名空间中,即__main__ )。 执行此模块时,将创建模块对象。 作为模块执行的一部分,执行的任何类定义都将生成一个类对象,然后将其绑定到模块命名空间中的类名。

所以从某种意义上说,你可以说类对象是“在”模块的命名空间中。 但实际上,您可以问一个类似的问题,“ 模块对象在哪里创建?”,此时答案就是解释器创建对象并有一个或多个引用,就像任何其他对象一样创造。

一个微妙之处在于垃圾收集器将收集任何没有引用它的对象。 对于类对象,周围的模块在其命名空间中具有它。 对于模块本身,始终存在来自sys.modules类的sys.modules

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM