在 Python 中,类定义(即类的主体)称为对象
实际上,这在 Python 中仍然被称为类。这就是为什么你这样定义它:
class Foo(object):
pass
使用class 关键字是因为结果仍称为类。
括号中的单词object 表明Foo 派生自名为object 的类。不要混淆——任何现有的类都可以在这里使用;事实上不止一个。
您通常从object 派生类的原因是一个历史事故,但可能值得详细说明。 Python 的原始对象实现将用户定义的类和内置类型视为略有不同的事物。然后语言的设计者决定统一这两个概念。因此,从object(或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 中的一切都是对象,因此类的实例也是对象。
您可能想知道的最后一件事是,正如类是构建对象的模板一样,也可以拥有用于构建类的模板。这些称为元类。基本元类称为type(即,普通的新式类是type 的实例)。
(是的,这就是我前面提到的type可以用来创建类,你可以调用它来创建类的原因是它是一个元类。)
要创建自己的元类,您可以从 type 派生它,如下所示:
class mymeta(type):
pass
元类是一个相当高级的 Python 主题,因此我不会深入探讨您可能会使用它们或如何使用它们,但它们应该清楚地说明 Python 在多大程度上采用了“一切都是对象”的概念。