组合、内置方法和反射
一、组合
什么叫组合
一个对象拥有一个属性,该属性的值是另一个对象。
组合有什么用
解决类与类之间代码冗余问题
便于代码统一维护
class People: def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender class Course(): def __init__(self, name, price, period): self.name = name self.price = price self.period = period python = Course('python', 20000, '6mon') linux = Course('linux', 20000, '5mon') class Student(People): def __init__(self, name, age, gender, course=None): if course is None: course = [] self.courses = course super().__init__(name, age, gender) def chose_course(self, course): self.courses.append(course) stu1 = Student('xk', 18, 'male') stu1.courses.append(python) # 对象python当作值赋给对象stu1的属性courses
二、内置方法
什么是是内置方法
定义在类内部,以__开头并__结尾的方法
特点:会在某种情况下自动触发
为何需要内置方法
为了定制类或者对象
如何使用内置方法
__str__在print打印时触发,会将返回值(必须时字符串)当作本次打印的结果
class Student(): def __init__(self, age, name): self.name = name self.age = age def __str__(self): return 'name:%s,age:%s' % (self.name, self.age) stu1 = Student('kk', 18) print(stu1) # name:18,age:kk
__del__ 在清理对象时触发,或者程序运行完后会先执行该方法
class Student(): def __init__(self, age, name): self.name = name self.age = age def __del__(self): print(1111) stu1 = Student('kk', 18) print(22222)
__enter__ 在使用 with语句时触发
__exit__ with语句结束时触发
class Open: def __init__(self, name): self.name = name def __enter__(self): print('出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量') # return self return 123 def __exit__(self, exc_type, exc_val, exc_tb): print('with中代码块执行完毕时执行我啊') with Open('a.txt') as f: print('=====>执行代码块') print(f)
__call__ 在对象加()时触发
class Foo: def __call__(self, *args, **kwargs): print('__call__') s = Foo() s()
三、反射
什么是反射
对象通过字符串操作属性的过程称为反射
主要涉及到以下四个方法
getattr() 利用字符串查找对象里的属性是否存在
class Student(): def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender stu1 = Student('k', 18, 'male') print(getattr(stu1, 'name', None)) # k print(getattr(stu1, 'name1', None)) # None
如果存在,则会返回该属性的值,不存在则会返回getattr里的第三个参数
setattr()利用字符串设置对象里的属性
class Student(): def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender stu1 = Student('k', 18, 'male') setattr(stu1, 'name', 'kk') print(getattr(stu1, 'name')) # kk
hasatt()利用字符串判断对象里的属性是否存在,存在返回True,不存在返回False
class Student(): def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender stu1 = Student('k', 18, 'male') print(hasattr(stu1, 'name')) # True print(hasattr(stu1, 'name1')) # False
delattr()利用字符串删除对象里的属性
class Student(): def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender stu1 = Student('k', 18, 'male') delattr(stu1,'name') print(stu1.__dict__) # {'age': 18, 'gender': 'male'}