Python 面向对象编程2

– 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

猜你喜欢

转载自blog.csdn.net/shangboerds/article/details/82902387