零基础入门python3.7 ——基础知识总结(二十六)多态和枚举类

一。多态

面向对象的语言除了封装。继承还有多态。 多态必须满足两个条件

  • 继承  :多态一定是发生在子类与父类之间
  • 重写 : 子类重写了父类的方法
class A1:
    def defs(self):
        print("1")

class A2(A1):
    def defs(self):
        print('2')

class A3(A1):
    def defs(self):
        print("3")

a = A1()
a.defs()

a = A2()
a.defs()

a = A3()
a.defs()

1
2
3

以上实例反应在类之间的继承和方法的重写。在调用同一个方法时。由于a代表不同的实例对象。 因此a.defs()在调用时不是调用同一个类中的方法。 而是调用各自类中的方法。这就是多态,

  • 由于有多态机制所以演变出了一种更精髓的写法
class A0:
    def defs(self, who):
        who.defs()

class A1:
    def defs(self):
        print("1")

class A2(A1):
    def defs(self):
        print('2')

class A3(A1):
    def defs(self):
        print("3")

a = A0()

a.defs(A1())
a.defs(A2())
a.defs(A3())


1
2
3

新建一个类在这个类中添加了一个同名的方法。而这个方法有额外带了一个除self的参数。 通过这个参数调用方法。 这样以来只需要传入传入各自的实例对象就可以调用各自的方法了。

二 枚举类

对于一些特殊的类来说其实例化对象的个数往往也是一定的。例如月份类最多可以实例化12个对象。对于这种特殊的类python3.4就增加了Enum枚举类。换句话说对于实例对象个数一定的类可以用枚举类来实现,

  • 定义一个枚举类只需要使其类继承enum中的Enum类
from enum import Enum
class School(Enum):
    name = 1
    age = 2
    city = 3

枚举类的成员有两部分组成

  • name属性。 这个属性指的是枚举类的变量名。
  • value属性。代表枚举值的序号。这个序号从1开始

枚举类是不能直接实例化成对象的。枚举一般有以下几种操作方式

  • 访问枚举成员
from enum import Enum
class School1(Enum):
    name = 1
    age = 2
    city = 3


print(School1.name)
print(School1['name'])
print(School1(1))
print(School1(3))

School1.name
School1.name
School1.name
School1.city
  • 访问value和name
from enum import Enum
class School1(Enum):
    name = 1
    age = 2
    city = 3

print(School1.name.value)
print(School1.age.name)


1
age
  • 遍历枚举类
from enum import Enum
class School1(Enum):
    name = 1
    age = 2
    city = 3

for key in School1:
    print(key)


School1.name
School1.age
School1.city
  • 枚举类无法比较大小。只能通过== 或is比较相等
from enum import Enum
class School1(Enum):
    name = 1
    age = 2
    city = 1

print(School1.name == School1.age)
print(School1["name"] is School1.city)


False
True
  • 枚举类的成员值不能在类的外部进行修改
from enum import Enum
class School1(Enum):
    name = 1
    age = 2
    city = 3

School1.name = 4

Traceback (most recent call last):
  File "/Users/apple/Documents/重要文件/python3/python21.py", line 7, in 
    School1.name = 4
  File "/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/enum.py", line 386, in __setattr__
    raise AttributeError('Cannot reassign members.')
AttributeError: Cannot reassign members.
  • 枚举类的__members__属性是包含一个枚举类所以成员的字典。通过遍历可以访问成员
from enum import Enum
class School1(Enum):
    name = 1
    age = 2
    city = 3

for key,value in School1.__members__.items():
    print(key,"-------", value)


name ------- School1.name
age ------- School1.age
city ------- School1.city
  • 枚举类规定name不能相同但是value可以相同
from enum import Enum,unique

class School1(Enum):
    name = 1
    age = 2
    city = 1

print(School1.city)

School1.name

但是结果却有点诧异。 出现这样的原因在于它将city当成了name的别名。  可以添加@unique 装饰器装饰器。当出现相同的成员时程序会抛出异常。

from enum import Enum,unique

@unique
class School1(Enum):
    name = 1
    age = 2
    city = 1

print(School1.city)

Traceback (most recent call last):
  File "/Users/apple/Documents/重要文件/python3/python21.py", line 4, in 
    class School1(Enum):
  File "/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/enum.py", line 869, in unique
    (enumeration, alias_details))
ValueError: duplicate values found in : city -> name
  • Enum()函数可以创建枚举类 ,这个方法接受两个参数。第一个是枚举的类名。一个是类成员
from enum import Enum

School = Enum("School", ("name", "age", 'city'))
print(School.name)
print(School['name'])
print(School(1))

print(School.name.name)
print(School.name.value)

for key in School:
    print(key)


School.name
School.name
School.name
name
1
School.name
School.age
School.city

 

你可能感兴趣的:(python)