一。多態
面向對象的語言除了封裝。繼承還有多態。 多態必須滿足兩個條件
- 繼承 :多態一定是發生在子類與父類之間
- 重寫 : 子類重寫了父類的方法
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