Python中的对象与实例

14 投票
5 回答
15579 浏览
提问于 2025-04-16 19:40

在C++中,只有对象和类,对象是类的实例。

而在Python中,类的定义(也就是类的内容)被称为一个对象。C++中的对象在Python中叫做实例。

可以查看这个链接

我说错了吗?

编辑:其实有人能用例子解释一下对象和实例的区别吗?

编辑:在Python中,所有东西都继承自object类,因此所有东西都是对象(也就是object类的对象)。

类本身也是一个对象(也就是object类的对象)。

实例是用来称呼任何类的对象的名字(也就是C++中的对象)。

请参考这个链接

5 个回答

5

在Python中,一切都是对象。连类本身也是一种特殊的对象,叫做 metaclass( metaclass)

9

在术语上,Python中的类和实例都被称为对象,但对于普通的Python程序员来说,这并不重要。你可以把Python的类和实例看作是C++中的类和实例:

class MyClass:
  data = 1

mc = MyClass()

MyClass是一个,而mc是类MyClass的一个实例


不过,Python的动态性比C++强得多,所以它的类也是对象。但这不是程序员通常会接触到的内容,所以你可以不用担心这个。

27

在Python中,类的定义(也就是类的内容)被称为对象。

其实,在Python中这仍然叫做类。这就是为什么你要这样定义它:

class Foo(object):
    pass

使用class这个关键词是因为结果仍然被称为类。

在括号里的object是为了表示Foo是从一个叫object的类派生出来的。不要搞混了——这里可以使用任何已有的类;实际上可以用多个。

通常你会从object派生类,这其实是历史原因,但值得一提。Python最初的对象实现把用户定义的类和内置类型视为稍微不同的东西。后来,语言的设计者决定把这两者统一起来。因此,从object(或其子类)派生的类和不从object派生的类行为上有些不同,后者被称为旧式类。旧式类的定义方式是这样的:

class Foo:
    pass

class Bar(Foo):
    pass

注意这些类并没有从object或任何从object派生的东西继承。这使得它们成为旧式类。

在使用Python 2.x时,你的类几乎总是应该从object继承,因为新式对象在几个小但重要的方面更好用。

更让人困惑的是,在Python 3.0及以后的版本中,没有旧式类,所以你不需要明确地从object派生。换句话说,在Python 3.x中,所有上述类都是新式类。

现在,回到正题。类是对象,因为在Python中一切都是对象。列表、字典、整数、字符串、元组……这些都是对象,Python程序的构建块:模块、函数和类也都是对象。你可以使用class关键词创建一个类,然后将其传递给一个函数,进行修改等等。(为了完整性,你也可以使用type()函数创建一个类。)

类是构建对象的模板,这些对象被称为实例。这一点你已经知道了。你实例化对象的方式类似于调用一个函数,传入初始值和其他参数:

mylist = list("abc")   # constructs ["a", "b", "c"]

在幕后,这会创建一个实例,然后调用新实例的__init__()方法来初始化它。由于在Python中一切都是对象,类的实例也是对象。

最后一件你可能想知道的事情是,正如类是构建对象的模板一样,也可以有构建类的模板。这些被称为 metaclasses( metaclass)。基础的元类叫做type(也就是说,一个普通的新式类是type的一个实例)。

(是的,这就是我之前提到的可以用来创建类的type,你可以用它来创建类的原因是它是一个元类。)

要创建你自己的元类,你可以从type派生,如下所示:

class mymeta(type):
    pass

元类是一个相当高级的Python话题,所以我不会深入讨论你可能用它们做什么或如何做,但它们应该清楚地表明Python在“万物皆对象”这个概念上走得有多远。

撰写回答