继承是一种的关系,和组合对比,组合是一种的关系,这两者都是解决代用重用问题的

继承

注意:继承不是遗传,在显示角度中,是通过对象抽象成类,再把这些类抽象成一个,就是父类。是自下而上的过程,在程序中是首先由父类,然后由类,之后才有对象,是自上而下的过程。


class classparent1: #父类
pass class classparent2:
pass class useclass1(classparent1): # 单继承
pass class useclass2(classparent1,classparent2): # 多继承
pass print(useclass1.__bases__)
print(useclass2.__bases__)

结果:

(<class 'main.classparent1'>,)

(<class 'main.classparent1'>, <class 'main.classparent2'>)

默认继承的是object类,Python3中都是新式类

类实例化

类实例化执行的时候首先从自己找,找不到从父类找。

继承与重用性

类中用的是父类的,不用重新写代码,实现了代码的复用。

class Hero:
def __init__(self,nickname,aggressivity,life_value):
self.nickname = nickname
self.aggressivity = aggressivity
self.life_value =life_value
def attack(self,enemy):
enemy.life_value -= self.aggressivity class Garen(Hero):
pass
class Riven(Hero):
camp = 'Noxus' g1 = Garen('garen',18,200) # 实例化
r1 = Riven('garen',18,200)

派生

在子类中添加新的功能属性,派生首先是继承一个父类,定义一个新的,定义一个父类重名的,都会从子类自己的地方找。

class Hero:
def __init__(self,nickname,aggressivity,life_value):
self.nickname = nickname
self.aggressivity = aggressivity
self.life_value =life_value def attack(self,enemy):
enemy.life_value -= self.aggressivity class Garen(Hero):
camp = 'Ddemacia'
def atatack(self,enemy):
pass
def fire(self):
print('%s is fireing' %self.nickname)
class Riven(Hero):
camp = 'Noxus' g1 = Garen('garen',18,200) # 实例化
r1 = Riven('garen',18,200)
g1.camp
g1.atack(r1) # 调用自己的,派生出新的功能

在派生中调用

子类继承了父类的方法,然后想进行修改,注意了是基于原有的基础上修改,那么就需要在子类中调用父类的方法

方法1

使用的是父类的的函数功能

class Hero:
def __init__(self, nickname,aggressivity,life_value):
self.nickname = nickname
self.aggressivity = aggressivity
self.life_value = life_value
def attack(self, enemy):
print('Hero attack')
class Garen(Hero):
camp = 'Demacia' def attack(self, enemy): #self=g1,enemy=r1
# self.attack(enemy) #g1.attack() 这是绑定方法 进入递归出错
Hero.attack(self,enemy) # 使用的是父类的attack 是函数,需要参数,selfs是上面传过来的
print('from garen attack') def fire(self):
print('%s is firing' % self.nickname)
class Riven(Hero):
camp = 'Noxus'
g1 = Garen('garen', 18, 200)
r1 = Riven('rivren', 18, 200)
g1.attack(r1)

对父类的init函数进行重用


class Hero:
def __init__(self, nickname, aggressivity, life_value):
self.nickname = nickname
self.aggressivity = aggressivity
self.life_value = life_value
def attack(self, enemy):
print('Hero attack')
enemy.life_value -= self.aggressivity
# print(Hero.__init__)
# print(Hero.attack)
class Garen(Hero):
camp = 'Demacia'
def __init__(self, nickname, aggressivity, life_value, script):
Hero.__init__(self,nickname,aggressivity,life_value)
self.script = script
def attack(self, enemy): # self=g1,enemy=r1
# self.attack(enemy) #g1.attack()
Hero.attack(self, enemy)
print('from garen attack')
def fire(self):
print('%s is firing' % self.nickname)
# g1=Garen('garen',18,200) #Garen.__init__(g1,'garen',18,200)
g1=Garen('garen',18,200,'人在塔在') #Garen.__init__(g1,'garen',18,200)
print(g1.script)

方法2 Spper

python3 super

#python3  super
class People:
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age def walk(self):
print("%s is walking"%self.name) class Chinese(People):
country = 'china'
def __init__(self,name,sex,age,language='Chinese'): super().__init__(name,sex,age) # python3中不需要再super内部传参数
self.language = language
def walk(self,x):
super().walk() #
print('子类的x',x) # c = Chinese('aaa','male',18)
c.walk(123)

当你使用super()函数时,Python会在MRO列表上继续搜索下一个类。只要每个重定义的方法统一使用super()并只调用它一次,那么控制流最终会遍历完整个MRO列表,每个方法也只会被调用一次(注意注意注意:使用super调用的所有属性,都是从MRO列表当前的位置往后找,千万不要通过看代码去找继承关系,一定要看MRO列表

python2中的额super

#python2 的super用法:
# super(自己的类,self).父类的函数名
# super只能适用于新式类 class People(object): # python2中需要定义新式类
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age def walk(self):
print("%s is walking"%self.name) class Chinese(People):
country = 'china'
def __init__(self,name,sex,age,language='Chinese'): super(Chinese,self).__init__(name,sex,age) # python3中不需要再super内部传参数
self.language = language
# def walk(self,x):
# super().walk() #
# print('子类的x',x) # c = Chinese('aaa','male',18)
print(c.name,c.age,c.language)

组合

组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合

首先明确的是组合不是继承,是一种有的关系,是类与类之间的关系。

'''

不用组合的情况

'''

class Teacher:
def __init__(self,name,sex,course_name,course_price,course_peroid):
self.name =name
self.sex = sex
self.course_name=course_name
self.course_price = course_price
self.course_peroid = course_peroid
class Student:
def __init__(self,name,sex,course_name,course_price,course_peroid):
self.name = name
self.sex = sex
self.course_name = course_name
self.course_price = course_price
self.course_peroid = course_peroid t1 = Teacher('egon','male',)
s1 = Student('cobile','name',) print(s1.course.name)
print(t1.course.name)

使用类的情况

# 使用组合重用代码
class Course: # 新建了一个课程类
def __init__(self,name,price,peroid):
self.name = name
self.price = price
self.peroid = peroid class Teacher:
def __init__(self,name,sex,course):
self.name =name
self.sex = sex
self.course=course
class Student:
def __init__(self,name,sex,course):
self.name = name
self.sex = sex
self.course = course
python_obj = Course('python',15800,'7m') # 实例化课程类
t1 = Teacher('egon','male',python_obj) # 直接用的是python_obj这个对象
s1 = Student('cobile','name',python_obj)

接口与归一化设计##

继承有两种用途:

一:继承基类的方法,并且做出自己的改变或者扩展(代码重用)

二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能

接口继承实质上是要求“做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的所有对象”——这在程序设计上,叫做归一化。

归一化使得高层的外部使用者可以不加区分的处理所有接口兼容的对象集合——就好象linux的泛文件概念一样,所有东西都可以当文件处理,不必关心它是内存、磁盘、网络还是屏幕(当然,对底层设计者,当然也可以区分出“字符设备”和“块设备”,然后做出针对性的设计:细致到什么程度,视需求而定)。

抽象类

这里用抽象类实现了接口的方法,抽象类是一个介于类和接口直接的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计

抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化

如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性。

抽象类用到了模块abc,装饰器

#抽象类
import abc
class Animal(metaclass=abc.ABCMeta):
tag = '123'
@abc.abstractclassmethod
def run(self):
pass
@abc.abstractclassmethod
def speak(self):
pass class People(Animal):
def run(self):
pass
def speak(self):
pass peo1 = People()
print(peo1.tag)

抽象类:本质还是类,与普通类额外的特点的是:加了装饰器的函数,子类必须实现他们

Python 继承、派生、组合、接口、抽象类的更多相关文章

  1. Python 继承和组合 接口

    #解决代码重用的问题,减少代码冗余 #继承是一种什么'是'什么的关系 class People: def __init__(self, name, age): # print('People.__in ...

  2. 初识JAVA(【面向对象】:pub/fri/pro/pri、封装/继承/多态、接口/抽象类、静态方法和抽象方法;泛型、垃圾回收机制、反射和RTTI)

    JAVA特点: 语法简单,学习容易 功能强大,适合各种应用开发:J2SE/J2ME/J2EE 面向对象,易扩展,易维护 容错机制好,在内存不够时仍能不崩溃.不死机 强大的网络应用功能 跨平台:JVM, ...

  3. python 面向对象 继承 派生 组合

    具体参考博客:http://www.cnblogs.com/linhaifeng/articles/6182264.html#_label12 一.面向对象 面向对象:对象与对象之间的相互交互,不可预 ...

  4. Day 23 类的继承,派生,组合,菱形继承,多态与多态性

    类的继承 继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类 继承的特性是:子类会遗传父类的属性 继承是类与类之间的关系 为什么用继承 使用继承可以减少代码的冗余 对象的继承 python中 ...

  5. python 继承与组合

    一.组合 #老师 课程 生日 class Course: def __init__(self,name,period,price): self.name = name self.period = pe ...

  6. Python开发基础-Day18继承派生、组合、接口和抽象类

    类的继承与派生 经典类和新式类 在python3中,所有类默认继承object,但凡是继承了object类的子类,以及该子类的子类,都称为新式类(在python3中所有的类都是新式类) 没有继承obj ...

  7. python基础之继承派生、组合、接口和抽象类

    类的继承与派生 经典类和新式类 在python3中,所有类默认继承object,但凡是继承了object类的子类,以及该子类的子类,都称为新式类(在python3中所有的类都是新式类) 没有继承obj ...

  8. Python(面向对象编程——2 继承、派生、组合、抽象类)

    继承与派生 ''' 继承:属于 组合:包含 一. 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称 ...

  9. python面向对象编程 继承 组合 接口和抽象类

    1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均用点来访问自己的 ...

  10. Py修行路 python基础 (十五)面向对象编程 继承 组合 接口和抽象类

    一.前提回忆: 1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均 ...

随机推荐

  1. 仿iPhone、iPad界面滑屏切换

    <!DOCTYPE html> <html lange='en'> <head> <meta charset='UTF-8'> <title> ...

  2. Mac 下sublime的插件

    最近更换了本本,入了港行的Mac pro,来替代原来的Thinkpad,在windows上工作做完之后,搭建了一下开发环境,eclipse是必须的,但是luna没有html editor,然后就在 e ...

  3. EF下使用自定义的connectionString避免数据库密码泄露

    在使用EF框架时,缺省情况下数据库访问字串是明码存放在app.config或web.config中的,相当于让数据库裸奔. 实际上EF在创建数据实体时,可以指定连接字串,取代在app.config中读 ...

  4. python进阶07 MySQL

    python进阶07 MySQL 一.MySQL基本结构 1.认识MySQL #MySQL不是数据库,它是数据库管理软件 #MySQL如何组织数据 #如何进入MySQL数据库 #其他注意事项 #以表格 ...

  5. CodeForces - 1004A-Sonya and Hotels(思维)

    Sonya decided that having her own hotel business is the best way of earning money because she can pr ...

  6. net core (下)

    net core (下) 第一部分: https://www.cnblogs.com/cgzl/p/8450179.html 本文是基于Windows10的. Debugging javascript ...

  7. 关于Spring配置文件xml文档的schema约束

    最开始使用spring框架的时候,对于其配置文件xml,只是网上得知其使用方法,而不明其意.最近想着寻根问底的探究一下.以下是本文主要内容: 1.配置文件示例. <?xml version=&q ...

  8. openstack安装newton版本dashboard+cinder(六)

    一.dashboard 1.安装dashboard及配置 [root@linux-node1 ~]# yum install openstack-dashboard -y #可以装任何地方只要能连接 ...

  9. 图解css3のborder-radius

    早期制作圆角都是使用图片来实现.通过用1px 的水平线条来堆叠出圆角或者利用JavaScript等等方法,但是都是需要增加多个无意义的标签来实现,造成代码亢余.如今有了CSS3的圆角属性——borde ...

  10. vfp使用笔记

    1:update数据,根据记录中某个字段的值,从另一个表中查询并填充数据 UPDATE cs2013yy SET cs2013yy.ksh=NVL((SELECT cs2013gkbm.ksh FRO ...