Python
  • 01、基础篇
    • Python基础篇-001. Python简介
    • Python基础篇-002. Hello World
    • Python基础篇-003. 变量类型(一)
    • Python基础篇-004. 常量
    • Python基础篇-005. 运算符
    • Python基础篇-006. 条件语句
    • Python基础篇-007. 循环语句
    • Python基础篇-008. 变量类型(二)
    • Python基础篇-009. 函数(一)
    • Python基础篇-010. 函数(二)
    • Python基础篇-011. 变量作用域
    • Python基础篇-012. 自定义类(一)
    • Python基础篇-013. 自定义类(二)
    • Python基础篇-014. 模块
    • Python基础篇-015. 异常处理
  • 02、进阶篇
    • Python进阶篇-001. 文件IO
    • Python进阶篇-002. main.py
    • Python进阶篇-003. init.py
    • Python进阶篇-004. all
    • Python进阶篇-005. private
    • Python进阶篇-006. lambda表达式
    • Python进阶篇-007. 推导式
    • Python进阶篇-008. 迭代器
    • Python进阶篇-009. 生成器
    • Python进阶篇-010. 多线程
    • Python进阶篇-011. 数据处理基础函数(一)
    • Python进阶篇-012. 数据处理基础函数(二)
    • Python进阶篇-013. 包管理(一)
    • Python进阶篇-014. 包管理(二)
    • Python进阶篇-015. 包管理(三)
    • Python进阶篇-016. 包管理(四)
    • Python进阶篇-017. requirements.txt
    • Python进阶篇-018. venv
    • Python进阶篇-019. 头部注释
    • Python进阶篇-020. 优雅传参
    • Python进阶篇-021. 连接MySQL
  • 03、实践篇
    • Python实践篇-001. GitBook小工具(一)
    • Python实践篇-002. GitBook小工具(二)
Powered by GitBook
On this page
  • 一、创作声明
  • 二、前言
  • 三、内部方法示例
  • 四、字符串形式
  • 五、比较大小
  • 六、写在最后
  1. 01、基础篇

Python基础篇-013. 自定义类(二)

[toc]

一、创作声明

本Python系列课程,是一门初级课程。目标是想让大家能在Python方面,实现从零基础到入门。这个课程的特殊性在于,这将是一门由我来主导教学思路,由ChatGPT来主导教学内容的课程。我认为这将会是一种非常有意思的尝试。

二、前言

本章学习目标:

  1. 了解自定义类内部方法是什么

  2. 对常见的自定义类内部方法,要学会功能说明,默认实现,什么场景下需要重写,以及怎么重写

三、内部方法示例

当我们使用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中,我们可以通过重写类的特殊方法来自定义类的比较操作。以下是一些常用的特殊方法和它们的默认实现:

  1. __eq__(self, other):用于实现相等比较操作(==)。默认实现是比较两个对象的内存地址是否相同。

  2. __ne__(self, other):用于实现不等比较操作(!=)。默认实现是返回not self.__eq__(other)。

  3. __lt__(self, other):用于实现小于比较操作(<)。默认实现是引发TypeError异常。

  4. __gt__(self, other):用于实现大于比较操作(>)。默认实现是引发TypeError异常。

  5. __le__(self, other):用于实现小于等于比较操作(<=)。默认实现是引发TypeError异常。

  6. __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

PreviousPython基础篇-012. 自定义类(一)NextPython基础篇-014. 模块

Last updated 1 year ago