組合&反射&面向物件內建函式
阿新 • • 發佈:2021-12-08
內容概要
- 組合
- 反射
- 面向物件的內建函式
- 異常
內容詳細
一、組合
組合:在物件中定義一個屬性,屬性的值是另一個物件
除了繼承父類的方法,這是獲取另一個類中屬性的另一種方式
如果想給學生物件新增課程屬性:
1、直接把課程資訊在呼叫階段傳入的話所需要的實參太多了,而且學生物件多需要不斷重複傳入
2、把課程資訊放在People類裡面的__init__初始化會給人的類添加了不屬於它的課程屬性
3、建立課程類,直接把課程類當作Student類的父類,不符合類的特性:學生不是課程類
所以解決以上方法,可以直接產生一個個課程物件,再把課程物件作為學生物件的值傳給學生物件,這種方法就是組合
class People: def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender class Course: def __init__(self, name, period, price): self.name = name self.period = period self.price = price # 產生課程物件 python = Course('python', '6mon', 20000) Linux = Course('Linux', '5mon', 10000) class Student(People): def __init__(self, name, age, gender, course=None): if not course: course = [] super().__init__(name, age, gender) self.courses = course # 定義新增課程的方法 def choose_course(self, course): self.courses.append(course) # 產生學生物件 stu = Student('elijah', 18, 'male') # 把課程物件當作屬性新增到學生物件的課程列表中 stu.choose_course(python) stu.choose_course(Linux) # 這樣就可以通過列表中的課程物件去獲取相應的課程資訊了 print(stu.courses[0].name) # python print(stu.courses[0].period) # 6mon print(stu.courses[0].price) # 20000
二、反射
1、getattr
獲取物件中的屬性值或者方法名,沒有屬性可以新增第三個引數返回None值
第一個引數是物件名,第二個引數是屬性名或者方法名(用字串的格式)
stu.name
print(getattr(stu, 'name', None))
# 獲取方法加括號可以直接呼叫
stu.func()
getattr(stu, 'choose_course')('linux')
2、setattr
給物件增加屬性,第三個引數是屬性的值
stu,course = 'math' setattr(stu, 'course', 'math')
3、hasattr
判斷物件中是否有該屬性,返回True或者False
hasattr(stu, 'name1')
4、delattr
刪除物件中的屬性
delattr(stu, 'name')
print(stu.__dict__)
三、內建方法
1、__init__ 呼叫類會自動啟動,用於初始化物件 class People: def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender 2、__str__ 列印類會自動呼叫,而且該方法要有return返回值,返回值只能是字串 class People: def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender def __str__(self): return 'name: %s' % self.name p = People('elijah', 18, 'male') print(p) # 3、__del__ # 刪除屬性時會自動觸發 4、__enter__ 與 __exit__ 程式上下文管理,程式啟動前會呼叫__enter__方法,程式結束後會執行__exit__方法 class Open(): def __init__(self, name): self.name = name def __enter__(self): print('程式執行前執行') def __exit__(self): print('程式執行後執行') with Open('a.txt') as f: f. 5、__call__