– Start
object 类
object 类是所有类的父类,它定义了好多方法,重写这些方法我们可以定制自己的类。
重写比较操作符
我们可以比较两个数字的大小,那我们自定义的类可不可以呢?其实很简单,我们只需要重写 object 类中定义的比较方法即可。
class MyNumber:
# 初始化属性
def __init__(self, num):
self.num = num
# 大于
def __gt__(self, other):
return self.num > other.num
# 大于等于
def __ge__(self, other):
return self.num >= other.num
# 小于
def __lt__(self, other):
return self.num < other.num
# 小于等于
def __le__(self, other):
return self.num <= other.num
# 等于
def __eq__(self, other):
return self.num == other.num
# 不等于
def __ne__(self, other):
return self.num != other.num
x = MyNumber(1)
y = MyNumber(1)
print(x > y)
print(x >= y)
print(x < y)
print(x <= y)
print(x == y)
print(x != y)
重写__ str__ & __ repr__ 方法
我们在初级篇中演示了重写 __ str__ 可以打印出友好的对象信息。
class MyNumber:
# 初始化属性
def __init__(self, num):
self.num = num
# 提供对象描述,给机器看的
def __repr__(self):
# 使用 super 调用父类方法
return super().__repr__()
# 提供对象描述,给人看的
def __str__(self):
return str(self.num)
x = MyNumber(1)
print(x)
print(str(x))
print(repr(x))
重写__ hash__ 方法
如果自定义类需要在 set 或 dict 中使用,需要实现 __ hash__ 方法
class Point:
# 初始化属性
def __init__(self, x, y):
self.x = x
self.y = y
# 提供对象描述,给人看的
def __str__(self):
return f'({self.x}, {self.y})'
# 提供对象描述,给机器看的
def __repr__(self):
return f'Point({self.x}, {self.y})'
# 等于
def __eq__(self, other):
return self.x == other.x and self.y == other.y
# 如果自定义类需要在 set 或 dict 中使用,需要实现 __hash__ 方法
# 相等的对象必须返回同样的 hash 值,所以我们必须实现 __eq__ 方法
def __hash__(self):
return hash((self.x, self.y))
p1 = Point(1, 1)
p2 = Point(1, 1)
s = {p1, p2}
print(s)
重写 __ bool__
我们知道任何对象都可以转成布尔型,事实上,一个对象是真是假由__ bool__觉得。
class Point:
# 初始化属性
def __init__(self, x, y):
self.x = x
self.y = y
# 如何判断对象真假
def __bool__(self):
return self.x != 0 or self.y != 0
print(bool(Point(0, 0)))
print(bool(Point(0, 1)))
多继承
Python 支持多继承,下面是一个简单的例子。
class A:
def a(self):
print('A.a')
class B:
def b(self):
print('B.b')
# 继承 A 和 B
class C(A, B):
def c(self):
print('C.c')
c = C()
c.a()
c.b()
c.c()
继承 or 组合?
Python 支持多继承,但是千万不要滥用,不要为了使用某个类的方法去继承某个类,这时候要使用组合,下面是一个简单的例子。
class A:
def a(self):
print('A.a')
class B:
# 传入 A 对象
def __init__(self, a):
self.a = a
# 调用 A 方法
def b(self):
self.a.a()
print('B.b')
a = A()
b = B(a)
b.b()
– 更多参见:Python 精萃
– 声 明:转载请注明出处
– Last Updated on 2018-09-30
– Written by ShangBo on 2018-09-29
– End