类的继承于查找顺序:
在py2中,不继承object的类为经典类,经典类继承查找:深度优先.
在py3中,默认继承object,所以python3中都是新式类,新式类的继承查找:广度优先.
类的特殊属性:
类名.__name__# 类的名字(字符串) 类名.__doc__# 类的文档字符串 类名.__base__# 类的第一个父类(在讲继承时会讲) 类名.__bases__# 类所有父类构成的元组(在讲继承时会讲) 类名.__dict__# 类的字典属性 类名.__module__# 类定义所在的模块 类名.__class__# 实例对应的类(仅新式类中)
class People: """ 我是文档 """ country='China' x=1 def run(self): """ 我也是文档 :return: """ print('----->', self) # 实例化出三个空对象 obj1=People() obj2=People() obj3=People() # 为对象定制自己独有的特征 obj1.name='egon' obj1.age=18 obj1.sex='male' obj2.name='lxx' obj2.age=38 obj2.sex='female' obj3.name='alex' obj3.age=38 obj3.sex='female' print(People.__doc__) # 类中的说明文档 # 我是文档 print(obj1.run.__doc__) # 类中方法的说明文档 #我也是文档 # :return: print(People.__name__) # 类的名字,返回是一个字符串 #People print(People.__bases__) # 类继承的父类 # (<class 'object'>,) print(People.__dict__) # 类的字典属性 #{'__module__': '__main__', '__doc__': ' 我是文档 ', 'country': 'China', 'x': 1, 'run': <function People.run at 0x0000000002A2D840>, '__dict__': <attribute '__dict__' of 'People' objects>, '__weakref__': <attribute '__weakref__' of 'People' objects>} print(People.__module__) # 类定义所在的模块 # __main__ print(People.__class__) # 实例对应的类(仅新式类,默认type类) # <class 'type'>
组合与继承都是有效地利用已有类的资源的重要方式。但是二者的概念和使用场景皆不同,
1.继承的方式
通过继承建立了派生类与基类之间的关系,它是一种'是'的关系,比如白马是马,人是动物。
当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好,比如老师是人,学生是人
2.组合的方式
用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系,比如教授有生日,教授教python和linux课程,教授有学生s1、s2、s3...
3.什么时候使用?
当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好
# 组合 class People: def __init__(self,name,sex,age): self.name = name self.sex=sex self.age =age class Course: def __init__(self,name,price,period): self.name =name self.price = price self.period =period class Stu(People): def __init__(self,name,sex,age): People.__init__(self,name,sex,age) self.course =[] class Teacher(People): def __init__(self,name,sex,age): People.__init__(self,name,sex,age) self.stu=[] # 创建课程对象 py = Course("python",19800,"8months") linux = Course("linux",12000,"9months") #创建学生对象 s1 = Stu("jack","男",22) s2 = Stu("lucy","女",18) # 给学校添加课程,这里运用了组合. s1.course.append(py) s1.course.append(linux) s2.course.append(py) s2.course.append(linux) #创建讲师对象 t1 = Teacher("Nick","男",25) # 给讲师添加学生,这里运用了组合. t1.stu.append(s1) t1.stu.append(s2) # 查看学生s1的课程信息 for course_obj in s1.course: print("课程名:%s,价格:%s,周期:%s"%(course_obj.name,course_obj.price,course_obj.period)) """ 课程名:python,价格:19800,周期:8months 课程名:linux,价格:12000,周期:9months """ # 查看讲师的学生 for stu in t1.stu: print(stu.name) """ jack lucy """