1. 程式人生 > 其它 >組合&反射&面向物件內建函式

組合&反射&面向物件內建函式

內容概要

  • 組合
  • 反射
  • 面向物件的內建函式
  • 異常

內容詳細

一、組合

組合:在物件中定義一個屬性,屬性的值是另一個物件

除了繼承父類的方法,這是獲取另一個類中屬性的另一種方式

如果想給學生物件新增課程屬性:
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__