[英]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。 我也查了一些参考文献。
类定义语法最简单的类定义形式如下所示:
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执行类的定义时,是的,创建了一个对象。 但重要的是要注意到这一点
type
的实例。 BlaBlaCar
)。 首先,为了消除任何疑问,类定义确实为您提供了一个表示类本身(而不是实例)的对象:
>>> class BlaBlaCar(object):
... pass
...
>>> id(BlaBlaCar)
57088312L
所以你看到BlaBlaCar
是内存中的一个对象。
你问,“创建的类对象在哪里?”
类定义通常位于模块中(或者在上面的示例中,在当前命名空间中,即__main__
)。 执行此模块时,将创建模块对象。 作为模块执行的一部分,执行的任何类定义都将生成一个类对象,然后将其绑定到模块命名空间中的类名。
所以从某种意义上说,你可以说类对象是“在”模块的命名空间中。 但实际上,您可以问一个类似的问题,“ 模块对象在哪里创建?”,此时答案就是解释器创建对象并有一个或多个引用,就像任何其他对象一样创造。
一个微妙之处在于垃圾收集器将收集任何没有引用它的对象。 对于类对象,周围的模块在其命名空间中具有它。 对于模块本身,始终存在来自sys.modules
类的sys.modules
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.