Python中一切皆对象,上图给出了根本性的阐释。具体而言,对象有id,类型,和值三大要素。不妨与Java对比分析Python“一切皆对象”的设计理念:
与Java一样,Python中的类也都是继承于同一个基类。在Java中,这个基类是Object,而在Python中,这个基类是object[1]
与Java不同的是,Python里对象的类型(即Python内置类型或程序员用class关键字定义的类)也是对象,这些对象是type类的实例[2]
那么我们来考查type,根据[1],type类继承object类;根据[2],object和type都是type类的实例,所以type对象是type类的实例。
综上,正是通过type类和type对象自己实例化自己的回环,Python实现了“一切皆对象”。
这一章用的Python语法有:
下面是一些例子
>>> type(list)
<class 'type'>
>>> list.__bases__
(<class 'object'>,)
>>> type(object)
<class 'type'>
>>> object.__bases__
()
>>> type(type)
<class 'type'>
>>> type.__bases__
(<class 'object'>,)
魔法函数没有特别抽象的理论,所以就直接上代码和例子吧。
dir(类)会返回类的所有属性和方法,比如dir(object)会看到一些魔法函数
dir(object)
Out[1]:
['__class__',
'__delattr__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__gt__',
'__hash__',
'__init__',
'__init_subclass__',
'__le__',
'__lt__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__']
举例来说,__eq__, __ge__, __gt__是比较运算,__repr__和__str__决定了对象的输出方式。
下面以__len__和__str__为例讲解魔法函数的使用。
__len__:如果一个类实现了__len__方法用于计算对象的长度,则可以用len(该类的对象)来获得该类对象的长度(当然也可以用 该类对象.__len__()来计算,两者是等价的)
class A:
def __init__(self, a=(1,2,3)):
self.content = a
def __len__(self):
return len(self.content)
a = A((1,3,4,5))
len(a)
Out[6]: 4
a.__len__()
Out[7]: 4
__str__:类似Java里重写toString方法,Python里的print(对象)语句实际上会执行print(对象.__str__())
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
return 'x:{}, y:{}'.format(self.x, self.y)
p = Point(1, 3)
print(p)
x:1, y:3
print(p.__str__())
x:1, y:3