Python进阶-10-Python根类&枚举类

来源:《Python从小白到大牛》关东升

1、Python根类------object

Python所有类都直接或间接继承自object类,它是所有类的"祖先"。object类有很多方法,本节重点介绍如下两个方法。

    __str__():返回该对象的字符串表示。
    __eq__(other):指示其他某个对象是否与此对象"相等"。

这些方法都是需要在子类中重写的,下面就详细解释一下他们的用法。

1.1__str__()方法

为了日志输出等处理方便,所有的对象都可以输出自己的描述信息。为此,可以重写__str__()方法。如果没有重写__str__()方法,则默认返回对象的类名,以及内存地址等信息,例如下面的信息:

    <__main__.Person object at 0x000001FE0F349AC8>

利用前面的Person类,重写它的__str__()方法代码:

    class Person:
        def __init__(self,name,age):
            self.name=name
            self.age=age

        def __str__(self):
            template='Person [name={0},age={1}]'
            s=template.format(self.name,self.age)
            return s

    person = Person('Tony',18)
    print(person)                   # Person [name=Tony,age=18]

上述代码覆盖了__str__()方法,返回什么样的字符串完全是自定义的,只要能够表示当前类和当前对象即可,本例是将Person成员变量拼接成一个字符串。

1.2对象比较方法

内容相等比较运算符"==" , = = == == 用来比较两个对象的内容是否相等。当使用运算符 = = == == 比较两个对象时,在对象的内部是通过__eq__()方法进行比较的。两个人(Person对象)相等是什么?是名字?是年龄?问题的关键是需要制定相等的规则,就是要指定比较的是哪些实例变量相等。所以为了比较两个Person对象是否相等,则需要重写__eq__()方法,在该方法中指定比较规则。

    class Person:
        def __init__(self,name,age):
            self.name=name
            self.age=age

        def __str__(self):
            template='Person [name={0},age={1}]'
            s=template.format(self.name,self.age)
            return s

        def __eq__(self,other):
            if self.name==other.name and self.age==other.age:
                return True
            else:
                return False
    p1=Person('Tony',18)
    p2=Person('Tony',18)

    print(p1=p2)     # True

上述代码重写了Person类__eq__()方法,if中提供了比较规则,即只有是name和age都相等才认为是两个对象相等。代码中创建了两个Person对象p1和p2,它们具有相同的name和age,所以 p 1 = = p 2 p1==p2 p1==p2 为True。为了比较可以不重写__eq__()方法,那么 p 1 = = p 2 p1==p2 p1==p2 为False。

2、枚举法

枚举是用来管理一组相关的有限个数常量的集合,使用枚举可以提高程序的可读性,使代码更清晰且更易于维护。在Python中提供枚举类型。他的本质上指一种类。

2.1定义枚举类

在Python中定义枚举类的语法格式如下:

    class 枚举类名(enumerate.Enum):
        枚举常量列表

枚举类继承自enum.Enum类。枚举中会定义多个常量成员。枚举类WeekDays具体代码如下:

    # coding=utf-8
    # 代码文件:chapter11/ch11.8.1.py

    import enum

    class WeekDays(enum.Enum):
        # 枚举常量列表
        MONDAYS=1
        TUESDAY=2
        WEDNESDAY=3
        THURSDAY=4
        FRIDAY=10

    day=WeekDays.FRIDAY

    print(day)         # WeekDays.FRIDAY
    print(day.value)   # 10
    print(day.name)    # FRIDAY

上述代码定义WeekDays枚举类,它有5个常量成员,每个常量成员值都需要进行初始化,day=WeekDays.FRIDAY是实例化枚举类WeekDays,该实例为FRIDAY。

注意:枚举类实例化与类不同,枚举类不能调用构造方法。枚举实例value属性是返回枚举值,name属性返回枚举名。
提示:常量成员值可以是任意类型,多个成员的值也可以相同。

2.2限值枚举类

为了存储和使用方便,枚举类中的常量成员取值应该是整数,而且每一常量成员应该有不同的取值。为了使枚举类常量成员只能使用整数类型,而可以使用enum.IntEnum作为枚举父类。为了防止常量成员值重复,可以为枚举加上@enum.unique装饰器

    # coding=utf-8

    import enum

    @enum.unique
    class WeekDays(enum.IntEnum):
        # 枚举常量列表
        MONDAY=1
        TUESDAY=2
        WEDNESDAY=3   # 'Wed.'
        THURSDAY=4
        FRIDAY=5      # 1

    day=WeekDays.FRIDAY

    print(day)
    print(day.value)
    print(day.name)

2.3使用枚举类

定义枚举类的主要目的是提高程序可读性,特别是在比较时,枚举类非常实用。

   # coding=utf-8

    import enum

    @enum.unique
    class WeekDays(enum.IntEnum):
        # 枚举常量列表
        MONDAY=1
        TUESDAY=2
        WEDNESDAY=3   # 'Wed.'
        THURSDAY=4
        FRIDAY=5      # 1
       
    day=WeekDays.FRIDAY

    if day==WeekDays.MONDAY:
        print('工作')
    elif day==WeekDays.FRIDAY:
        print('学习')
相关推荐
happybasic42 分钟前
通过纯文字引导DeepSeek编写一个简单的中国象棋引擎~
人工智能·python·中国象棋·deepseek
代码驿站52043 分钟前
PHP语言的并发编程
开发语言·后端·golang
老大白菜1 小时前
第1章:Go语言入门
开发语言·后端·golang
夜幕龙1 小时前
Dexcap复现代码数据预处理全流程(四)——demo_clipping_3d.py
人工智能·python·机器人
DevOpsDojo1 小时前
MATLAB语言的正则表达式
开发语言·后端·golang
等一场春雨2 小时前
Java 23 集合框架详解:ArrayList、LinkedList、Vector
java·开发语言
qincjun2 小时前
Qt仿音乐播放器:媒体类
开发语言·qt
小白编程95272 小时前
matlab离线安装硬件支持包
开发语言·matlab
桂月二二3 小时前
深入探索 Rust 中的异步编程:从基础到实际案例
开发语言·后端·rust
早上好啊! 树哥5 小时前
JavaScript Math(算数) 对象的用法详解
开发语言·javascript·ecmascript