Python中的对象与实例
5 个回答
在Python中,一切都是对象。连类本身也是一种特殊的对象,叫做 metaclass( metaclass)。
在术语上,Python中的类和实例都被称为对象,但对于普通的Python程序员来说,这并不重要。你可以把Python的类和实例看作是C++中的类和实例:
class MyClass:
data = 1
mc = MyClass()
MyClass
是一个类,而mc
是类MyClass
的一个实例。
不过,Python的动态性比C++强得多,所以它的类也是对象。但这不是程序员通常会接触到的内容,所以你可以不用担心这个。
在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在“万物皆对象”这个概念上走得有多远。