'''
1什么是继承?
继承一种新建类的方式,在python中支持一个儿子继承多个爹
新建的类称为子类的或者派生类
父类有可以称为基类或者超类 子类会‘遗传’父类的属性 2 为什么要用继承
减少代码冗余 3 怎么用继承 ''' # class ParentClass1:
# pass
#
# class ParentClass2:
# pass
#
# class Subclass1(ParentClass1):
# pass
# class Subclass2(ParentClass1,ParentClass2):
# pass # print(Subclass2.__bases__)
# (<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>) # 在python2中有经典类与新式类之分
# 在python3中全部为新式类 '''
1 继承是类与类之间的关系,寻找这种关系需要先抽象再继承
'''
# class OldboyPeople:
# school='oldboy'
#
# def __init__(self,name,age,sex):
# self.name=name
# self.age=age
# self.sex=sex
#
# class OldboyTeacher(OldboyPeople):
# def change_score(self):
# print('teacher %s is changing score'%self.name)
#
#
# class Oldboystudent(OldboyPeople):
# def choose(self):
# print('student %s choose course'%self.name) # tea1=OldboyPeople('egon',18,'male') ##OldboyPeople.__init__()
# stu1=OldboyPeople('alex',73,'female') # print(tea1.name,tea1.age,tea1.sex)
# egon 18 male
# print(stu1.name)
# alex
# # class OldboyPeople:
# school = 'oldboy'
#
# def __init__(self, name, age, sex):
# self.name = name
# self.age = age
# self.sex = sex
#
# def f1(self):
# print('爹的f1')
# class OldboyTeacher(OldboyPeople):
# def change_score(self):
# print('teacher %s is changing score' %self.name) # tea1 = OldboyTeacher('egon', 18, 'male')
# print(tea1.__dict__) #{'name': 'egon', 'age': 18, 'sex': 'male'}
#
# print(tea1.name) #egon
#
# print(tea1.school) #oldboy
#
# tea1.change_score() #teacher egon is changing score
# tea1.f1() #爹的f1 # class Foo:
# def f1(self):
# print('Foo.f1')
#
# def f2(self): #self=obj
# print(self) #<__main__.Bar object at 0x0000000002173898>
#
# print('Foo.f2')
# self.f1() #obj.f1()
#
# class Bar(Foo):
# def f1(self):
# print('Bar.f1')
#
# obj =Bar()
# print(obj.__dict__) #{}
#
# obj.f2() # Foo.f2
# Bar.f1 '''
派生:子类定义自己新的属性,如果与父类同名,以子类自己的为准
'''
# class OldboyPeople:
# school = 'oldboy'
#
# def __init__(self, name, age, sex):
# self.name = name
# self.age = age
# self.sex = sex
#
# def f1(self):
# print('爹的f1')
# class OldboyTeacher(OldboyPeople):
# def change_score(self):
# print('teacher %s is changing score' %self.name)
#
# def f1(self):
# print('儿子的f1')
#
# tea1 = OldboyTeacher('egon', 18, 'male')
#
# tea1.f1() #儿子的f1 子类有的用子类的 没有网上查
#
# # class OldboyPeople:
# school = 'oldboy'
#
# def __init__(self, name, age, sex):
# self.name = name
# self.age = age
# self.sex = sex
#
# def f1(self):
# print('爹的f1')
#
# class OldboyTeacher(OldboyPeople):
# def __init__(self,name,age,sex,level,salary):
# self.name=name
# self.age=age
# self.sex=sex
#
# self.level=level
# self.salary=salary
#
# def change_score(self):
# print('teacher %s is changing score' %self.name)
#
# def f1(self):
# print('儿子的f1')
#
# tea1 = OldboyTeacher('egon', 18, 'male',9,3.1)
# print(tea1.name,tea1.age,tea1.sex,tea1.level,tea1.salary) '''
在子类派生出的新方法中重用父类的功能
方式一:指名道姓地调用(其实与继承没有什么关系的)
OldboyPeople.__init__(self,name, age, sex)
''' #
# class OldboyPeople:
# school = 'oldboy'
#
# def __init__(self, name, age, sex):
# self.name = name
# self.age = age
# self.sex = sex
#
# def tell_info(self):
# print("""
# ===========个人信息==========
# 姓名:%s
# 年龄:%s
# 性别:%s
# """ %(self.name,self.age,self.sex)) # class OldboyTeacher(OldboyPeople):
# # tea1,'egon', 18, 'male', 9, 3.1
# def __init__(self, name, age, sex, level, salary):
# # self.name = name
# # self.age = age
# # self.sex = sex tea1 先调用OldboyTeacher __init__ self 已经把自己传入了
# OldboyPeople.__init__(self,name, age, sex) #在类中调用类自己的方法(不是嵌套) 类自己调方法就是当做普通的函数调用 需要几个值
# #就传入几个
#
# self.level = level
# self.salary = salary
#
# def tell_info(self):
# OldboyPeople.tell_info(self) #指名道姓的调用类里面的方法
# print("""
# 等级:%s
# 薪资:%s
# """ %(self.level,self.salary))
#
# tea1 = OldboyTeacher('egon', 18, 'male', 9, 3.1)
# # print(tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary)
#
#
# # tea1.tell_info() '''
方法二:super()调用(严格以来依赖于继承)
super()的返回值是一个特殊的对象,该对象专门用来调用父类中的属性
在python2中 需要super(当前 自己的类名,self)
python3中super()可以不用传参数
'''
# class OldboyPeople:
# school = 'oldboy'
#
# def __init__(self, name, age, sex):
# self.name = name
# self.age = age
# self.sex = sex
#
# def tell_info(self):
# print("""
# ===========个人信息==========
# 姓名:%s
# 年龄:%s
# 性别:%s
# """ %(self.name,self.age,self.sex))
#
# class OldboyTeacher(OldboyPeople):
# # tea1,'egon', 18, 'male', 9, 3.1
# def __init__(self, name, age, sex, level, salary):
# # OldboyPeople.__init__(self,name, age, sex)
# super(OldboyTeacher,self).__init__(name,age,sex)
#
# self.level = level
# self.salary = salary
#
# def tell_info(self):
# # OldboyPeople.tell_info(self)
# super().tell_info()
# print("""
# 等级:%s
# 薪资:%s
# """ %(self.level,self.salary))
#
# tea1 = OldboyTeacher('egon', 18, 'male', 9, 3.1)
# # print(tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary)
# tea1.tell_info() '''
1 新式类:
继承object 的类,以及该类的子类,都是新式类 在python3中,如果一个类没有指定继承的父类,默认就继承object
所以说python3中所有的类都是新式类 2 经典类(只有在python2才区分经典类与新式类):
没有继承object的类,以及该类的子类,都是经典类 '''
# class Foo(object):
# pass
#
# class Bar(Foo):
# pass
#
# print(Foo.__bases__)
# print(Bar.__bases__)
'''
1. 什么是继承
继承是一种新建类的方式,新建的类称之为子类/派生类,被继承的类称之为父类/基类/超类 继承有3个特点:
1. 子类可以遗传/重用父类的属性(解决类与类之间代码冗余的问题)
2. 在python中一个子类可以同时继承多个父类
3. 在继承的背景下,类分为两种:新式类,经典类
新式类:但凡继承object类的子类,以及该子类的子子孙孙都是新式类
在python3中一个类即便是没有显式地继承任何类,默认就继承object类,
即在python3中所有类都是新式类
经典类:没有继承object类的子类,以及该子类的子子孙孙都是经典类
强调:只有在python2中才有经典类
在python2中如果一个类没有显式地继承任何类,并不会自动继承object类 2. 为何要用继承:减少类与类之间的代码冗余 3. 如何继承
class Foo:
pass
class Bar(Foo):
pass #obj=Bar()
#obj.x Bar.x 4. 属性查找
在没有出现菱形继承的情况下,属性的查找是按照从左往右的顺序一个分支一个分支的找下去
在出现菱形继承(一个子类继承的多个分支最终汇聚到一个非object类)的情况下,
新式类:广度优先查找,按照从左往右的顺序一个分支一个分支的找下去,在最后一个分支才去查找顶级类
经典类:深度优先查找,按照从左往右的顺序一个分支一个分支的找下去,在第一个分支就查找顶级类 5. 派生
在子类中定义自己的属性,如果与父类的属性重名,那以自己的为准. 在子类派生的新方法中重用父类的功能:
方式一:指名道姓地调用某一个类的函数
特点:
1. 与继承无关
2. 没有自动传值的效果 方式二:super()得到一个特殊的对象,该对象专门用来引用父类的属性
特点:
1. 严格依赖继承,完全参照mro
2. 有自动传值的效果
'''
继承与抽象(先抽象在继承)
继承描述的是子类与父类之间的关系,要找出这种关系,必须先抽象在继承
  继承:是基于抽象的结果,通过编程语言去实现它,肯定是先经历抽象这个过程,才能通过继承的方式去表达出抽象的结构
  
  抽象只是分析和设计的过程中,一个动作或者说一种技巧,通过抽象可以得到类 什么是抽象类 :抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化
为什么要有抽象类:如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的
    内容包括数据属性和方法属性。
    从设计角度来看,如果类是从现实对象抽象而来的,那么抽象类就是基于类抽象而来的
    从实现角度来看,抽象类与普通类的不同之处在于:抽象类中只能有抽象方法(没有实现功能),该类不能被
    实例化,只能被继承,且子类必须实现抽象方法。
抽象类的本质还是类,指的是一组类的相似性,包括数据属性和方法属性,而接口只强调函数属性的相似性。
抽象类是一个介于类和接口之间的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计

继承 派生 super()经典类 新式类的更多相关文章

  1. 洗礼灵魂,修炼python(43)--巩固篇—经典类/新式类

    经典类 1.什么是经典类 就是在使用class关键词时,括号内不添加object类的就叫经典类,前面的博文里是绝对解析过的,所以你应该知道,经典类现在已经仅存在于python2了,因为python3不 ...

  2. Python 中的经典类新式类

    Python 中的经典类新式类 要知道经典类和新式类的区别,首先要掌握类的继承 类的继承的一个优点就是减少代码冗余 广度优先和深度优先,这主要是在多类继承的时候会使用到 经典类和新式类的主要区别就是类 ...

  3. 面向对象:继承(经典类&新式类继承原理、属性查找)、派生

    继承: 继承是指类与类之间的关系,是一种“什么”是“什么”的关系. 继承的功能之一就是用来解决代码重用问题 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以称为基 ...

  4. 关于Python中的类普通继承与super函数继承

    关于Python中的类普通继承与super函数继承 1.super只能用于新式类 2.多重继承super可以保公共父类仅被执行一次 一.首先看下普通继承的写法 二.再看看super继承的写法 参考链接 ...

  5. python之继承、抽象类、新式类和经典类

    一.上节补充1.静态属性静态属性 : 类的属性,所有的对象共享这个变量 如果用对象名去修改类的静态属性:在对象的空间中又创建了一个属性,而不能修改类中属性的值 操作静态属性应该用类名来操作 例1:请你 ...

  6. python 全栈开发,Day20(object类,继承与派生,super方法,钻石继承)

    先来讲一个例子 老师有生日,怎么组合呢? class Birthday: # 生日 def __init__(self,year,month,day): self.year = year self.m ...

  7. 【python】-- 类的多继承、经典类、新式类

    继承知识点补充 在python还支持多继承,但是一般我们很少用,有些语言干脆就不支持多继承,有多继承,就会带来两个概念,经典类和新式类. 一.多继承 之前我们都是讲的单继承,那么什么是多继承呢?说白了 ...

  8. Python中新式类和经典类的区别,钻石继承

    1)首先,写法不一样: class A: pass class B(object): 2)在多继承中,新式类采用广度优先搜索,而旧式类是采用深度优先搜索. 3)新式类更符合OOP编程思想,统一了pyt ...

  9. 面向对象【day07】:新式类和经典类(八)

    本节内容 1.概述 2.类的多继承 3.经典类VS新式类 4.总结 一.概述 在python还支持多继承,但是一般我们很少用,有些语言干脆就不支持多继承,有多继承,就会带来两个概念,经典类和新式类,下 ...

随机推荐

  1. MTCP 在 64 位机器上不工作

    今天打开以前写的 MTCP, 却无法运行. 报错如下: Exception in thread "Thread-0" java.lang.UnsatisfiedLinkError: ...

  2. [daily] cscope

    手册: http://cscope.sourceforge.net/cscope_vim_tutorial.html 下载 cscope_maps.vim 到 $HOME/.vim/plugin/ 目 ...

  3. Hibernate处理事务并发问题

    在Hibernate中设置事务的隔离级别.<property name="hibernate.connection.isolation">2</property& ...

  4. python numpy库的基本内容

    import numpy as np np.getfromtxt("路径",delimiter = "," ,dtype = str)  #读取txt文件数据 ...

  5. ReLU激活函数的缺点

    训练的时候很”脆弱”,很容易就”die”了,训练过程该函数不适应较大梯度输入,因为在参数更新以后,ReLU的神经元不会再有激活的功能,导致梯度永远都是零. 例如,一个非常大的梯度流过一个 ReLU 神 ...

  6. Notification web 桌面消息推送

    var NotificationHandler = { isNotificationSupported: 'Notification' in window, isPermissionGranted: ...

  7. mysql千万级大数据SQL查询优化30条经验

    转自http://blog.163.com/zhangjie_0303/blog/static/9908270620146951355834/ 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 w ...

  8. php----------linux下安装php的swoole扩展

    1.首先你已经安装好了php环境,这里就不介绍php环境的安装了.如果你是编译安装记得将php加入环境变量,以便于方便查看扩展是否安装成功. 2.我安装的php环境缺少了要给东西,详细看下图 如果你没 ...

  9. VS2008生成解决方案卡顿、龟速

    1.工具-选项-项目和解决方案-MS BUILD 项目生成输出详细信息中选择“诊断” 2.进入.NET环境的安装位置:C:\WINDOWS\Microsoft.NET\Framework\v3.5 , ...

  10. 微信中H5网页如何唤醒打开外部浏览器打开指定链接

    最近遇到一个需求.朋友找我制作一个在微信中的聊天框,或者公众号菜单发布一条链接或者二维码.跳出微信打开一个指定的我们自己的页面, 拿到这个需求后我们团队分开去找资料研究方案,通过微信的开发文档.腾讯的 ...