来源:《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('学习')