组合、内置方法和反射
一、组合
什么叫组合
一个对象拥有一个属性,该属性的值是另一个对象。
组合有什么用
解决类与类之间代码冗余问题
便于代码统一维护
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'}


浙公网安备 33010602011771号