• 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}
    年龄={1}
    擅长位置={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("今天不是周一哦")
    悟已往之不谏,知来者之可追
  • 相关阅读:
    linux 用户与用户组
    linux 用户管理、权限管理
    linux服务与进程
    linux 磁盘阵列
    linux 文件系统 磁盘分区 格式化
    linux shell基础
    Linux网络设置
    DNS域名服务器配置
    Arduino 各种模块篇 摇杆模块
    Arduino 不同Arduino衍生板子的问题
  • 原文地址:https://www.cnblogs.com/ljh-study/p/13869199.html
Copyright © 2020-2023  润新知