类的继承、派生、组合、菱形的继承、多态

类的继承

继承是一种新建的类的方式,新建的类成为子类,被继承的类称为父亲

继承的特性是:子类会遗传父亲的属性

继承是类与类之间的关系

使用继承目的,可以减少代码的咒余

在python中,父类和子类只有在继承的时候才会产生

继承是为了拿到父类的所有东西

class Parent_Foo:
    def __init__(self,first_name,money,car,house)
    self.first_name = first_name
    self.car = car
    self.house =house
    self.money = money*0.5
    print('继承的财产扣掉一办')

    def find_wife(self):
        print(f'{self.first_name}先生找到妻子白富美‘)

class Son_Foo(Parent_Foo)
      pass

sf= Son_FOO('二','1000','tesla','上海汤臣一品')
print(sf.first_name)
print(sf.money)
print(sf.car)
sf.find_wife()
#二
#500.0
#tesla
#上海汤臣一品1栋
#二先生找到妻子白富美              
class Animal():
    def __init__(self,height,weight)
        self.height = height
        self.weight =weight
    def jiao(self):
        print(self.__class__.__name__,'叫')

class Xingxing():
    def sleep(self):
        print('睡觉')

class People(Animal,Xingxing):
    def read(self):
        print('read')

    def jiao(self)
        print('jiao')

aobama = People(170,140)
aobama = jiao()
#jiao
aobama = sleep()
#睡觉
meixi = People(168,140)
meixi.jiao()
#jiao

class Dog(Animal):
    def eat_shi(self):
        print('eat_shi')

shinubi = Dog(40,50)
shinubi.jiao()
# Dog 叫
==# 不推荐使用继承,当你继承多个的时候,功能与功能之间会混乱,顶多继承一
个
# 继承后查找顺序:先自己,在类,在父类,在父类,在父类的父类==
class Foo:
    def f1(self)
        print('Foo.f1')

    def f2(self)            # self =b
        print('Foo.f2')
        self.f1()           #b.f1()

class Bar(Foo):
    def f1(self)
        print('Bar.f1')

b = Bar()
#{}
print(b.__dict__)
# Foo.f2
b.f2()
# Bar.f1

类的派生

  • 派生:子类中新定义的属性的这个过程叫做派生,并且需要记住子类在使用派生的属性始终是以自己的为准
  • 指明道姓访问某一个类的函数:该方式与继承无关
#派生方法一:
class OldboyPeople:
    '''由于学生和老师都是人,因此人都有姓名,年龄,性别'''
    school ='oldboy'

    def __init__(self,name,age,gender):
        self.name = name
        self.age = age
        self.gender =gender

class OldboyStudent(OldboyPeople):
    """由于学生类没有独立的__init__()方法,因此不需要声明继承父类的__init__方法,会自动生成"""
    def chooser_course(self):
        print('%s is choosing course' %self.name)

class OldboyTeacher(OldboyPeople):
    """由于老师类有独自的__init__()方法,因此需要声明继承父类的__init__()"""
    def __init__(self,name,age,gender,level):
        OldboyPeople.__init__(self,name,age,gender)
        self.level=level

    def score(self,stu_obj,num)
        print('% is scoring'% self.name)
        stu_obj.score = num

stu1 = OldboyStudent('tank',18,'male')
tea1 = OldboyTeacher('nick','18','male',10)

print(stu1.__dict__)
#{'name': 'tank', 'age': 18, 'gender': 'male'}

print(tea1.__dict__)
{'name': 'nick', 'age': 18, 'gender': 'male', 'level': 10
  • 严格以来继承属性查找关系
  • super()会得到一个特殊的对象,该对象就是专门用来访问父类中的属性的(按照继承关系来的)
  • super().__init__(不用为self传值)
  • super 的完整用法就是super(自己的类名,self),在python2中需要写完整,在python3中口蹄疫简写为super()
#派生方法二:
class OldboyPeolpe:
    school ='oldboy'

    def __init__(self,name,age,aex)
        self.name =name
        self.age = age
        self.sex = sex

class OldboyStudent(OldBboyPeople):
    def __init__(self,name,age,sex,stu_id):
        super().__init__(name,age,sex)
        self.stu_id = stu_id

    def choose_course(self):
        print('%s is choosing course'% self.name)

stu1 = OldboyStudent('tank',19,'male',1)

print(stu1.__dict__)

#{'name': 'tank', 'age': 19, 'sex': 'male', 'stu_id': 1}

类的组合

  • 组合就是一个类的对象具备爱某一个属性,该属性的值是指向另一个类的对象
  • 组合是用来解决类与类之间代码咒余的问题
  • 组合可以理解成多个人去造一个机器人,有的人造头,有的人造身体,手,大家完工后,最后机器人造出来了
#简单的选课系统
class People:
    def __init__(self,name,gender):
        self.name = name
        self.gender = gender

    def eat(self):
        print(f'{self.name}开始吃了')

class Student(People):
    def __init__(self,student_id,name,gender):
        self.student_id = student_id
        super(Student,self).__init__(name,gender)

    def choose_course(self,course):
        self.course = course
        print(f'{self.name}选课{course.name}成功)

def Teacher(People):
    def __init__(self,level,name,gender):
         self.level = level
         super(Teacher,self).__init__(name,gender)

    def scored(self,student,course,score):
        print(f'老师{self.name}给{student.name}课程{course.name}打分{score})

def Course:
     def __init__(self,name,price):
          delf.name =name
          delf.price =price

def Admin(People):
      def create_course(self,name,price):
          course = Course(name,price)
          print(f'管理员{self.name}创建了课程{name}')
          return course

#课程
#python = Course('Python','888')
#linux = Course('Linux','666')

#学生
zhubajie  =Student('01','zhubajie','male')
sunwukong = Student('02','sunwukong','male')

# 老师
nick = Teacher('1','nick','male')
tank =Teacher('2','tank','male')

#管理员
egon  =Admin('egon','male')

# 业务逻辑
*1创建课程
python = egon.create_course('python','8888')
print(python.__dict__)
==管理员egon创建了课程python
{'name': 'python', 'price': '8888'}

linux = egon.create_course('linux','6666')
print(linux.__dict__)
==管理员egon创建了课程linux
{'name': 'linux', 'price': '6666'}            

*2学生选择课程
zhubajie.choose_corse(python)

==zhubajie选课python成功              

*3老师给学生打分
nick.scored(zhubajie,python,'0')              

==老师nick给zhubajie课程python打分0

菱形的继承

经典类 和新式类

在python3 当中 会默认继承object类

在python2 当中 不会默认继承object类,必须得自己手动添加

新式类:只要继承了object类的就是新式类,在python3当中所有的类都是新式类

经典类:没有继承object类的就是经典类,只要python2当中有经典类

当继承为菱形继承的时候,经典类和新式类的搜索某一个属性的循序会不一样的

  • 经典类下:深度优先
  • 新式类下:广度优先
  • 经典类:一条路走到黑,深度优先

类的多态与多态性

多态指的是一类事物有多种形态

  • 序列数据类型有多种形态:字符串,列表,元祖
  • 动物有多种形态:人,狗,猪
#动物有多种形态:人类,猪,狗
def Animal:
    def run(self):          #子类约定俗成的必须实现这个方法
        raise AttributeError    ('子类必须实现这个方法')

class People(Animal):
    def run(self):
        print('人在走')

class Pig(Animal):
    def run(self):
        print('Pig is walking')

class Dog(Animal):
    def run(self):
        print('dog is running')

peo1 =People()
pig1 =Pig()
d1 = Dog()

peo1.run()
#人在走
pig1.run()
#pig is walking
d1.run()
#dog is runing
import abc

class Animal(metaclass=abc.ABCMeta):  # 同一类事物:动物
    @abc.abstractmethod  # 上述代码子类是约定俗称的实现这个方法,加上@abc.abstractmethod装饰器后严格控制子类必须实现这个方法
    def talk(self):
        raise AttributeError('子类必须实现这个方法')

class People(Animal):  # 动物的形态之一:人
    def talk(self):
        print('say hello')

class Dog(Animal):  # 动物的形态之二:狗
    def talk(self):
        print('say wangwang')

class Pig(Animal):  # 动物的形态之三:猪
    def talk(self):
        print('say aoao')

peo2 = People()
pig2 = Pig()
d2 = Dog()

peo2.talk()
#say hello
pig2.talk()
#say aoao
d2.talk()
# wangwang

多态性

注意:多态与多态性非等同

多态性是指具有不停功能得函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。在面向对象的方法中一般是这样表述多态性:向不同的对象发送同一条信息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去相应共同的消息,所谓消息,就是调用函数,不同的行为就是指不同的时间,即执行不同的函数

多态性的好处

  • 1,增加了程序的灵活性:以不变应万变,不论对象千遍万遍,使用者都是同一种形式调用,如 func
  • 2,增加了程序额的可扩展性:通过集成Animal类创建了一个新的类,使用者无法更新自己的代码,还是用func(animal)去调用

原文地址:https://www.cnblogs.com/zhuyuanying123--/p/11056477.html

时间: 2024-07-30 11:41:14

类的继承、派生、组合、菱形的继承、多态的相关文章

继承,派生,组合

1 .继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 1 class People: 2 pass 3 class Animal: 4 pass 5 class Student(People,Animal):#people ,Animal 是父类(基类),Student是子类(派生类) 6 pass 7 print(Student.__bases__)#(<class '__main__.People'>, &

9. 实现类复用的两个手段——继承与组合

一.实现类复用概述 1. 如果需要复用一个类,可以把这个类当成基类来继承 如果访问权限允许,子类可以直接访问父类的成员变量和方法,相当于子类可以直接复用父类的成员变量和方法 继承带来高度复用的同时,也严重地破坏了父类的封装性 如果只是出于类复用的目的,并不一定需要使用继承,完全可以使用组合来实现 2. 如果需要复用一个类,还可以把这个类当成新类的组合成分 新类可以直接复用这个类的public成员变量和方法 二.实现类复用的补充说明 1. 继承方式中,子类可以直接获得父类的public方法,程序使

Python基础- 类和对象(使用、继承、派生、组合、接口、多态、封装、property、staticmethod、classmethod、反射、slots、上下文管理协议、元类)

标签: python对象 2017-07-01 16:28 79人阅读 评论(0) 收藏 举报  分类: python(11)  版权声明:本文为广大朋友交流学习,如有纰漏望不吝赐教,若存在版权侵犯请及时与我联系 目录(?)[+] 一.初识类和对象 在python3中类型就是类 先定义类在产生相对应的对象,也就是现有了概念再有了实体 class Garen: camp = 'Demacia' def attack(self): print('attack') 1.如何使用类 在python3:

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

类的继承与派生 经典类和新式类 在python3中,所有类默认继承object,但凡是继承了object类的子类,以及该子类的子类,都称为新式类(在python3中所有的类都是新式类) 没有继承object类的子类成为经典类(在python2中,没有继承object的类,以及它的子类,都是经典类) 1 class People: 2 pass 3 class Animal: 4 pass 5 class Student(People,Animal): #People.Animal称为基类或父类,

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

类的继承与派生 经典类和新式类 在python3中,所有类默认继承object,但凡是继承了object类的子类,以及该子类的子类,都称为新式类(在python3中所有的类都是新式类) 没有继承object类的子类成为经典类(在python2中,没有继承object的类,以及它的子类,都是经典类) 1 class People: 2 pass 3 class Animal: 4 pass 5 class Student(People,Animal): #People.Animal称为基类或父类,

c++ 类的继承派生

作者:张煜 这周上的c++课上老师讲了类的继承和派生,总觉得他讲的相当的不完整. 类的继承是利用已有的类来建立专用类的编程技术.从另一个角度来说,从已有的类(父类)产生一个新的子类,称为类的派生. 继承是面向程序设计中最重要的机制,它支持层次分类的观点.继承使得程序员可以在一个较一般的类的基础上很快地建立一个新类,而不必从零开始设计每个类,在现实世界中,许多实体或概念不是孤立的,它们具有共同的特征,但也有细微的差别,人们使用层次分类的方法来描述这些实体或概念之间的相似点和不同点.如下图:    

Python基础----继承派生、组合、接口和抽象类

类的继承与派生 经典类和新式类 在python3中,所有类默认继承object,但凡是继承了object类的子类,以及该子类的子类,都称为新式类(在python3中所有的类都是新式类) 没有继承object类的子类成为经典类(在python2中,没有继承object的类,以及它的子类,都是经典类) 1 class People: 2 pass 3 class Animal: 4 pass 5 class Student(People,Animal): #People.Animal称为基类或父类,

C++类的继承与组合区别

C++的“继承”特性可以提高程序的可复用性.正因为“继承”太有用.太容易用,才要防止乱用“继承”.我们要给“继承”立一些使用规则: 一.如果类A 和类B 毫不相关,不可以为了使B 的功能更多些而让B 继承A 的功能. 不要觉得“不吃白不吃”,让一个好端端的健壮青年无缘无故地吃人参补身体. 二.如果类B 有必要使用A 的功能,则要分两种情况考虑: (1)若在逻辑上B 是A 的“一种”(a kind of ),则允许B 继承A 的功能.如男人(Man)是人(Human)的一种,男孩(Boy)是男人的

钻石(菱形)继承和虚基类

钻石(菱形)继承 如图,B,C继承了A,D继承了B,C 在这种情况下,如果D类的对象通过B.C两个不同的作用域调用A的数据成员,将会产生两个 不同的A的数据成员值 如下(Grandfather对应A,a是其公有数据成员,Father1,Father2对应B.C,son对应D的对象,) 可以看到有两个不一样的a存在,说明在赋值过程中Father1,Father2分别调用Grandfather产生两个a 从其运行结果也可以看出来 如果son对象仅想产生一个数据成员a,则必须对Grandfather进