组合,反射,内置方法
一、组合
1.类的组合:
在一个类中以另外一个类的对象作为数据属性
2.组合与继承的区别?
继承是一种“是”的关系,比如老师是人、学生是人,当类之间有很多相同的之处,应该使用继承;而组合则是一种“有”的关系,比如老师有生日,老师有多门课程,当类之间有显著不同,并且较小的类是较大的类所需要的组件时,应该使用组合
class Date:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
class Teacher:
def __init__(self, name, age, year, month, day):
self.name = name
self.age = age
self.birth = Date(year, month, day)
stu = Teacher('小明', 24, 1990, 12, 8)
print(stu.birth)
二、反射
1.反射的概念
反射机制是指的是在程序的运行状态中,对于任意一个类,都可以知道这个类的所有属性和方法;对于任意一个对象,都能够调用他的任意方法和属性。这种动态获取程序信息以及动态调用对象的功能称为反射机制。
2.如何实现反射?
在程序运行过程中,如果我们获取一个不知道存有何种属性的对象,若想操作其内部属性,可以先通过内置函数dir来获取任意一个类或者对象的属性列表,列表中全为字符串格式。
3.如何通过字符串操作对象的属性?
使用内置函数hasattr()、getattr()、setattr()、delattr()
<1> hasattr(对象,属性) 判断对象是否含有某个属性,该属性是类中的属性名,不是赋值
class A:
def __init__(self, name, age):
self.name = name
stu = A('lili')
print(hasattr(stu, 'lili')) # False
print(hasattr(stu, 'name')) # True
<2> getattr(对象,属性,属性不存在时的返回值)
class A:
def __init__(self, name, age):
self.name = name
self.age = age
stu = A('lili', 13)
print(getattr(stu, 'name', 'name不存在时的返回值')) # lili
print(getattr(stu, '属性', '属性不存在时的返回值')) #属性不存在时的返回值
<3> setattr(对象,属性,属性值)为对象内中增加新的值
class A:
def __init__(self, name, age):
self.name = name
self.age = age
stu = A('lili', 13)
print(stu.__dict__) # {'name': 'lili', 'age': 13}
setattr(stu, 'part ', '小明')
setattr(stu, 'level', 14)
print(stu.__dict__)
# {'name': 'lili', 'age': 13, 'part ': '小明', 'level': 14}
<4> delattr(对象,属性名)存在则删除,不存在报错
class A:
def __init__(self, name, age):
self.name = name
self.age = age
stu = A('lili', 13)
print(stu.__dict__) # {'name': 'lili', 'age': 13}
delattr(stu, 'name')
print(stu.__dict__) # {'age': 13}
print(stu.'name') # 不存在即报错
三、内置方法
1.概念:
Python的Class机制内置了很多特殊的方法来帮助使用者高度定制自己的类,这些内置方法都是以双下划线开头和结尾的,会在满足某种条件时自动触发。
2.常用的内置方法
__init__()
__str__()
__del__()
__enter__()
__exit__()
__call__()