Python基础22 __str__() __eq__() 枚举类

  1 #object
  2 #Python的根类
  3 
  4 #所有的类都直接或者间接的继承object类
  5 #这里就只简单的讲两个方法
  6 
  7 #__str__()
  8 #返还该对象的字符串表示
  9     #为了方便日志的输出
 10     #所有对象都可以输出自己所描述的信息
 11     #所以可以重写__str__()方法
 12     #注意:
 13     #如果没有重写__str__()方法
 14     #默认返回的是对象的类名以及内存地址等信息
 15     
 16 #而这里重写__str__()就利用到了多态性了
 17 #我们不需要对根类object进行修改
 18 #只需要在子类中添加一个__str__()来覆盖它就好了
 19 
 20 class person(object):
 21     def __init__(self,name,age,skilled):
 22         self.name=name
 23         self.age=age
 24         self.skilled=skilled
 25 
 26     def __str__(self):
 27         string="姓名={0}\n年龄={1}\n擅长位置={2}".format(self.name,self.age,self.skilled)
 28         return string
 29 
 30 I=person("L",20,"上单")
 31 print(I.__str__())
 32 #这里我们就重构了object中__str__()类
 33 #让他存在多态性
 34 #但是我们之前说过了
 35 #__str__()是object的方法,作用是直接返还数据
 36 #那么我就可以不用在实例后面手动输入__str__()了
 37 #可以直接通过实例来输出
 38 print(I)
 39 
 40 print("//////////////////////////////")
 41 
 42 #第二个常用方法
 43 #__eq__(other)方法
 44 #当我们使用==来进行比较操作的时候,实际上是调用的__eq__(other)这个方法
 45 #而一般来说,他的作用是某个对象是否与此对象相等
 46 #在自己使用的过程中,我们常常重构这个方法
 47 #让它适合我们后面的运算
 48 
 49 #还是以上面的person1类举例
 50 
 51 class person1(person):
 52     def __init__(self,name,age,skilled,ability):
 53         super().__init__(name,age,skilled)
 54         self.ability=ability
 55     
 56     def __eq__(self,other):
 57         if self.skilled == other.skilled :
 58             if self.ability> other.ability :
 59                 string="{0}更强一些".format(self.name)
 60                 return string
 61             else:
 62                 string="{0}更强一些".format(other.name)
 63                 return string
 64         else:
 65             string="位置不同,无法比较"
 66             return string
 67 
 68 #这样我们就建立了一个新的类person1
 69 #然后,我们在这里重构了__eq__()方法
 70 #使得它可以按照我们的标准来判断大小
 71 #并返还相应的数据
 72                 
 73 I=person1("L",20,"上单",10)
 74 O=person1("O",18,"上单",999)
 75 B=person1("Z",19,"中单",200)
 76 print(I==O)
 77 print(I==B)
 78 #这样就实现了__eq__()的重构
 79 
 80 print("/////////////////////////////////////")
 81 
 82 #枚举类
 83 #枚举类用来管理有限的常量集合
 84     #枚举类继承自enum.Enum类,
 85     #这样才能说明这类是枚举类
 86     #而枚举类中会定义多个常量成员,注意,是常量
 87     #而且枚举类不需要,也不能使用构造方法
 88 
 89 class week(object): #这里就定义的是一个普通的类
 90     pass
 91 
 92 import enum     #注意,这里需要调用enum包才能使用枚举类
 93 class week_1(enum.Enum):
 94     Monday=7
 95     Tuesday=4
 96     Wednesday=2
 97     Thursday=3
 98     Friday=1
 99     Saturday=9
100     Sunday=9
101 
102 #day=week_1()
103 #这里会直接报错
104 #原因是,枚举类不能使用 类名() 的形式表示
105 #而是要以 类名.常量名 来使用
106 #而且这里不是实例化
107 #而是相当于一个赋值
108 #只是赋值上去的不是一个单纯的数据,而是一个 name + value 的数据集上去
109 #所以正确的调用方式是
110 
111 day=week_1.Wednesday
112 print(day)          #week_1.Wednesday
113 print(day.name)     #Wednesday
114 print(day.value)    #2
115 
116 print("//////////////////////////////")
117 
118 #限制枚举类
119 #为了储存和使用方便,枚举类中的常量成员取值应该是整数
120 #而且每一个常量成员应该有不同的取值
121 #为了使得枚举类常量成员只能使用整数类型
122 #可以使用enum.IntEnum作为枚举父类。
123 
124 #这里我们看到
125 #解释中提到了枚举类中常量成员的取值在限制枚举类中是整数
126 #这是不是意味着不是限制枚举类可以以随意设置取值
127 
128 
129 import enum     #注意,这里需要调用enum包才能使用枚举类
130 class week_2(enum.Enum):
131     Monday=7
132     Tuesday=4.0
133     Wednesday=2+7j
134     Thursday='A'
135     Friday="我?"
136     #Saturday=9+'A'
137     #语法不允许,和C不一样
138     Sunday=9-1.25
139 d1=week_2.Monday
140 print(d1)
141 print(d1.name)
142 print(d1.value)
143 
144 d2=week_2.Tuesday
145 print(d2)
146 print(d2.name)
147 print(d2.value)
148 
149 d3=week_2.Wednesday
150 print(d3)
151 print(d3.name)
152 print(d3.value)
153 
154 d4=week_2.Thursday
155 print(d4)
156 print(d4.name)
157 print(d4.value)
158 
159 d5=week_2.Friday
160 print(d5)
161 print(d5.name)
162 print(d5.value)
163 
164 d6=week_2.Sunday
165 print(d6)
166 print(d6.name)
167 print(d6.value)
168 
169 #从上面的多个例子中
170 #我们发现这里值都可以使用任何数据
171 
172 #所以这里我们再建立一个限制性枚举类
173 
174 @enum.unique
175 class week_3(enum.IntEnum):
176     Monday=1
177     Tuesday=2
178     Wednesday=5
179     #Test=5.5
180     #Test='A'
181     #Test=2+5j
182     #这些都是不行的
183 dd1=week_3.Monday
184 print(dd1.name)
185 print(dd1.value)
186 
187 dd2=week_3.Wednesday
188 print(dd2.name)
189 print(dd2.value)
190 
191 #这样都是没有问题的
192 #dd2.value=5.0
193 #这里就是直接报错了
194 #因为它不能修改数据
195 #注意:就算是修改成和原来一样的数据也是不可以的
196 
197 print("//////////////////////////////")
198 
199 #使用枚举类
200 #可以提高程序可读性,特别是在比较的时候
201 
202 @enum.unique
203 class week_4(enum.IntEnum):
204     Mon=1
205     Tus=2
206     Wed=3
207     Thu=4
208     Fri=5
209 #我们这就建立了一个限制枚举类
210 #枚举类通过其值可以直接拿来使用
211 day2=week_4.Wed
212 #这里我们的d2的数据值就是wed的3
213 if d2 == week_4.Mon:
214     print("今天是周一")
215 else:
216     print("今天不是周一哦")

 

posted @ 2020-10-24 13:37  想活出点人样  阅读(253)  评论(0编辑  收藏  举报