零基礎入門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 <module>
    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 <module>
    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 <enum 'School1'>: 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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章