zoukankan      html  css  js  c++  java
  • Day 5-<补充> 类的的继承和查找顺序

    类的继承于查找顺序:

    在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
    
    """
  • 相关阅读:
    浅谈图标布局
    和浏览器异步请求取消相关的那些事
    chrome浏览器的跨域设置——包括版本49前后两种设置
    cordova加载层、进度条、文件选择插件
    js构建ui的统一异常处理方案(四)
    js构建ui的统一异常处理方案(三)
    通过 IntelliJ IDEA 来 Debug Jar包
    JPA使用Specification like查询时特殊字符%和_处理问题 Escape示例
    java8新特性:利用Lambda处理List集合
    让开发部署提速的 IDEA 插件神器攻略(转)
  • 原文地址:https://www.cnblogs.com/lovepy3/p/9096719.html
Copyright © 2011-2022 走看看