一、 组合
1.1 什么是组合?
组合就是,一个对象拥有一个属性,该属性的值是另外一个对象.
class Foo: def __init__(self, m): self.m = m class Bar(): def __init__(self, n): self.n = n
注:一个对象拥有一个属性,该属性的值是另外一个对象
1.2 什么场景下使用继承? 什么场景下使用组合?
继承一般情况用在:什么是什么的情况 is
组合一般用在:什么有什么的情况 has
二、反射
2.1 什么是反射
在Python中,反射指的是通过字符串来操作对象的属性,涉及到四个内置函数的使用(Python中一切皆对象,类和对象都可以用下述四个方法)
2.2 四个内置函数
getattr: 获取属性 ##### 用的最多
setattr:设置属性
hasattr:判断是否有某个属性
delattr:删除
反射:就是通过字符串的形式来操作对象的属性
class Student(): school = 'SH' def __init__(self,name, age): self.name=name self.age = age def func(self): print('from func') def index(self): print('from index') stu = Student('kevin', 20) # attr=input('请输入你要操作的属性名:') # print(stu.school) # print(stu."school")
当你查询的属性不存在的时候,如果给了第三个参数,就返回第三个参数
res=getattr(stu, 'school1', 666)
如果你给了第三个参数,查询的属性也存在,那就直接返回属性对应的值,默认值就没用了
# res=getattr(stu, 'school', 666) # SH 666 # res1=getattr(stu, 'name') # SH # res2=getattr(stu, 'age') # SH # print(res,res1, res2) # print(stu.school) # print(res)
2.3 函数的用法(必须掌握)
1. getattr
res=getattr(stu, 'func1', stu.index) #### 用的是最多的 print(res) <bound method Student.func of <__main__.Student object at 0x000001963F5C5A60>> res()
2. setattr(设置)
setattr(stu, 'x', 666) # stu.x=666 print(stu.__dict__)
3. hasattr
print(hasattr(stu, 'func')) if hasattr(stu, 'func'): getattr(stu, 'func')() else: ...
4. delattr
delattr(stu, 'name') del stu.name print(stu.__dict__) import time time=__import__('time') # import time print(time.time()) random=__import__('random') print(random.randint(0,8))
三、 内置方法之魔术方式(重要)
它的特点就是双下划线开头的方法,它满足一定的条件就会自动触发,简称魔法。
3.1 有哪些魔术方法
1. __init__
2. __str__,__repr__class Student(): def __init__(self, name, age): self.name = name self.age = age
"""
1. 打印对象的时候,输出对象的时候会自动触发类中得__str__方法
2. 返回值必须是字符串形式
3. 如果它跟__repr__方法同时存在,__str__的优先级更高
"""3.__del__
"""
1.当你删除对象的时候会触发__del__的执行
2. 当整个脚本的程序都执行完毕的时候,也会触发__del__的执行
3. 一般用在用来在对象被删除时自动触发回收系统资源的操作
"""def __del__(self): print('from _del') self.f.close()
4. __enter__和 __exit__
class Open: def __init__(self, name): self.name = name def __enter__(self): print('出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量') # return self def __exit__(self, exc_type, exc_val, exc_tb): print('with中代码块执行完毕时执行我啊')
注:with它可以用在很多地方,但是,出现with语句后面的对象中得类必须要声明__enter__和__exit__
5. setitem,getitem,delitem__
__setitem__,__getitem,__delitem__ class Foo: def __init__(self, name): self.name = name """当你通过中括号获取对象的属性的时候,会自动触发__getitem__""" def __getitem__(self, item): print('__getitem__') print(self.__dict__[item]) def __setitem__(self, key, value): # key:age # value:18 print('__setitem__') self.__dict__[key] = value # self.__dict__['age'] = 18 def __delitem__(self, key): print('del obj[key]时,我执行') self.__dict__.pop(key) pass # def __delattr__(self, item): # print('del obj.key时,我执行') # self.__dict__.pop(item) obj=Foo('tom') # print(obj.name) # obj['name'] obj['age'] = 18 # obj.age=18 print(obj.age) del obj['age']
6. __call__
class Foo: def __init__(self): pass #### 当对象加括号的时候会触发__call__的执行 def __call__(self, *args, **kwargs): print('__call__') obj=Foo() print(obj) obj()