Python基础篇-013. 自定义类(二)
[toc]
一、创作声明
本Python系列课程,是一门初级课程。目标是想让大家能在Python方面,实现从零基础到入门。这个课程的特殊性在于,这将是一门由我来主导教学思路,由ChatGPT来主导教学内容的课程。我认为这将会是一种非常有意思的尝试。
二、前言
本章学习目标:
了解自定义类内部方法是什么
对常见的自定义类内部方法,要学会功能说明,默认实现,什么场景下需要重写,以及怎么重写
三、内部方法示例
当我们使用Python编程时,可以通过自定义类来创建自己的对象类型。下面是一个示例:
class Car:
def __init__(self, brand, model, color):
self.brand = brand
self.model = model
self.color = color
self.speed = 0
def accelerate(self, increment):
self.speed += increment
def brake(self, decrement):
self.speed -= decrement
def __str__(self):
return f"{self.color} {self.brand} {self.model}"
def __repr__(self):
return f"Car(brand='{self.brand}', model='{self.model}', color='{self.color}')"
def __eq__(self, other):
return self.brand == other.brand and self.model == other.model and self.color == other.color
def __gt__(self, other):
return self.speed > other.speed
def __lt__(self, other):
return self.speed < other.speed
在上面的示例中,我们定义了一个名为Car的类。它具有以下内部方法:
__init__(self, brand, model, color)
: 这是一个特殊的方法,用于初始化对象的属性。在这个例子中,我们使用传入的参数来设置车辆的品牌、型号和颜色,并将速度初始化为0。accelerate(self, increment)
: 这个方法用于加速车辆的速度。它接受一个增量参数,并将速度增加相应的值。brake(self, decrement)
: 这个方法用于减速车辆的速度。它接受一个减量参数,并将速度减少相应的值。__str__(self)
: 这个方法用于返回对象的字符串表示。在这个例子中,我们返回一个描述车辆颜色、品牌和型号的字符串。__repr__(self)
: 这个方法用于返回对象的可打印表示。在这个例子中,我们返回一个类似于创建对象的Python代码的字符串。__eq__(self, other)
: 这个方法用于比较两个对象是否相等。在这个例子中,我们比较车辆的品牌、型号和颜色是否相等。__gt__(self, other)
: 这个方法用于比较两个对象的大小关系。在这个例子中,我们比较车辆的速度是否大于另一个车辆的速度。__lt__(self, other)
: 这个方法用于比较两个对象的大小关系。在这个例子中,我们比较车辆的速度是否小于另一个车辆的速度。
这些是自定义类中常用的一些内部方法,它们可以根据实际需求进行自定义和重写。
四、字符串形式
1、功能说明
在Python中,我们可以通过在自定义类中定义__str__
和__repr__
方法来自定义对象的字符串表示形式。
__str__
方法用于返回对象的可读性较好的字符串表示形式,通常用于打印对象或在交互式环境中显示对象。__repr__
方法用于返回对象的官方字符串表示形式,通常用于调试和开发目的。
2、默认实现
如果我们没有在自定义类中定义__str__
和__repr__
方法,Python会使用默认的实现来生成这些字符串表示形式。默认情况下,__str__
方法返回<__main__.ClassName object at 0x...>
,其中ClassName
是类的名称,0x...
是对象在内存中的地址。__repr__
方法返回与__str__
方法相同的字符串。
下面是一个示例,展示了自定义类中__str__
和__repr__
的默认实现:
class MyClass:
pass
obj = MyClass()
print(obj) # 输出:<__main__.MyClass object at 0x...>
print(repr(obj)) # 输出:<__main__.MyClass object at 0x...>
3、重写场景
如果我们想要自定义对象的字符串表示形式,可以在类中定义__str__
和__repr__
方法,并返回我们想要的字符串。
4、自定义实现案例
class MyClass:
def __str__(self):
return "This is an instance of MyClass."
def __repr__(self):
return "MyClass()"
obj = MyClass()
print(obj) # 输出:This is an instance of MyClass.
print(repr(obj)) # 输出:MyClass()
通过定义__str__
和__repr__
方法,我们可以根据需要自定义对象的字符串表示形式,使其更加有意义和可读性。
五、比较大小
1、功能说明与默认实现
在Python中,我们可以通过重写类的特殊方法来自定义类的比较操作。以下是一些常用的特殊方法和它们的默认实现:
__eq__(self, other)
:用于实现相等比较操作(==)。默认实现是比较两个对象的内存地址是否相同。__ne__(self, other)
:用于实现不等比较操作(!=)。默认实现是返回not self.__eq__(other)
。__lt__(self, other)
:用于实现小于比较操作(<)。默认实现是引发TypeError
异常。__gt__(self, other)
:用于实现大于比较操作(>)。默认实现是引发TypeError
异常。__le__(self, other)
:用于实现小于等于比较操作(<=)。默认实现是引发TypeError
异常。__ge__(self, other)
:用于实现大于等于比较操作(>=)。默认实现是引发TypeError
异常。
2、重写场景
不是所有的自定义类都需要实现__eq__
、__gt__
和__lt__
方法。这些方法是用于比较对象的,根据具体的需求来决定是否需要实现它们。
__eq__
方法用于判断两个对象是否相等,即==
操作符的行为。如果你希望能够比较两个对象的相等性,就需要实现这个方法。__gt__
方法用于判断一个对象是否大于另一个对象,即>
操作符的行为。如果你希望能够比较两个对象的大小关系,就需要实现这个方法。__lt__
方法用于判断一个对象是否小于另一个对象,即<
操作符的行为。如果你希望能够比较两个对象的大小关系,就需要实现这个方法。
如果你的自定义类不需要进行对象的比较操作,那么就不需要实现这些方法。
3、自定义实现案例
下面是一个自定义类实现比较大小的案例:
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
def __lt__(self, other):
return self.area() < other.area()
def __gt__(self, other):
return self.area() > other.area()
def __eq__(self, other):
return self.area() == other.area()
# 创建两个矩形对象
rect1 = Rectangle(5, 10)
rect2 = Rectangle(3, 8)
# 比较矩形的面积大小
if rect1 > rect2:
print("rect1的面积大于rect2")
elif rect1 < rect2:
print("rect1的面积小于rect2")
else:
print("rect1的面积等于rect2")
在上面的例子中,我们定义了一个Rectangle
类,该类具有width
和height
属性,以及计算面积的area()
方法。我们还重载了<
、>
和==
运算符,使得可以直接比较两个矩形对象的面积大小。
注意,我们使用__lt__
、__gt__
和__eq__
这些特殊方法来实现运算符重载。这些方法会在使用相应运算符进行比较时被调用。
运行上述代码,将会输出rect1的面积大于rect2
,因为rect1
的面积为50,而rect2
的面积为24。
六、写在最后
更多技术分享,点击传送门:https://github.com/maxiaolu66/profile
Last updated