python菱形继承_Python面向对象(组合、菱形继承、多态)

今日内容:

1.组合

2.菱形继承

3.多态与多态性

昨天内容重点回顾:

1)调用也叫实例化:发生了2件事

1.创造空对象

2.触发对象下的__init__方法,然后将p连同参数一同传给init

2)绑定关系

1.类的调用就是普通函数

2.大多数给对象调用的,绑定给对象用的

绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入

精髓:对象不仅是一系列数据(自己独有的+与其他对象共有的),还包含专门操作该数据的方法

1.组合

1、什么是组合

组合就是一个类的对象具备某一个属性,该属性的值是指向另外外一个类的对象

2、为何用组合

组合也是用来解决类与类直接代码冗余问题的

3、如何用组合

实例:选课系统

class Course:

def __init__(self,name,period,price):

self.name=name

self.period=period

self.price=price

def tell_info(self):

msg="""

课程名:%s

课程周期:%s

课程价钱:%s

""" %(self.name,self.period,self.price)

print(msg)

#老师和学生的父类

class OldboyPeople:

school = 'oldboy'

def __init__(self, name, age, sex):

self.name = name

self.age = age

self.sex = sex

#学生类

class OldboyStudent(OldboyPeople):

def __init__(self,name,age,sex,stu_id):

OldboyPeople.__init__(self,name,age,sex)

self.stu_id=stu_id

def choose_course(self):

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

#老师类

class OldboyTeacher(OldboyPeople):

def __init__(self, name, age, sex, level):

OldboyPeople.__init__(self,name,age,sex)

self.level=level

def score(self,stu,num):

stu.score=num

print('老师[%s]为学生[%s]打分[%s]' %(self.name,stu.name,num))

# 创造课程

python=Course('python全栈开发','5mons',3000)

linux=Course('linux运维','5mons',800)

# python.tell_info()

# linux.tell_info()

# 创造学生与老师

stu1=OldboyStudent('猪哥',19,'male',1)

tea1=OldboyTeacher('egon',18,'male',10)

stu1.choose_course()

tea1.score(stu1,99)

# 》》》》实现的目的是直接通过stu1和teal调用课程

# 将学生、老师与课程对象关联/组合

stu1.course=python                      #》》》》通过中间变量的值指向课程类的对象

tea1.course=linux

stu1.course.tell_info()

tea1.course.tell_info()

"""

super去改写版本:

class OldboyStudent(OldboyPeople):

def __init__(self,name,age,sex,stu_id):

# OldboyPeople.__init__(self,name,age,sex)

super(OldboyStudent,self).__init__(name,age,sex,)

self.stu_id=stu_id

def choose_course(self):

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

class OldboyTeacher(OldboyPeople):

def __init__(self, name, age, sex, level):

# OldboyPeople.__init__(self,name,age,sex)

super(OldboyTeacher,self).__init__(name,age,sex)

self.level=level

def score(self,stu,num):

stu.score=num

print('老师[%s]为学生[%s]打分[%s]' %(self.name,stu.name,num))

"""

2.菱形继承

'''

1、菱形继承

当一个子继承多个父类时,多个父类最终继承了同一个类,称之为菱形继承

2、菱形继承的问题:

python2区分经典类与新式类,如果子的继承是一个菱形继承,那么经典类与形式的区别为?

经典类下查找属性:深度优先查找

新式类下查找属性:广度优先查找

'''

class G(object):

# def test(self):

#     print('from G')

pass

class E(G):

# def test(self):

#     print('from E')

pass

class B(E):

# def test(self):

#     print('from B')

pass

class F(G):

# def test(self):

#     print('from F')

pass

class C(F):

# def test(self):

#     print('from C')

pass

class D(G):

# def test(self):

#     print('from D')

pass

class A(B,C,D):

def test(self):

print('from A')

# pass

obj=A()

print(A.mro())

# obj.test() #A->B->E-C-F-D->G-object

3.多态

""

1 什么是多态

多态指的是同一种事物的多种形态

水-》冰、水蒸气、液态水

动物-》人、狗、猪

2 为和要用多态

多态性:

继承同一个类的多个子类中有相同的方法名

那么子类产生的对象就可以不用考虑具体的类型而直接调用功能

3 如何用

"""

#多态性继承同一个类的多个子类中有相同的方法名

# 第一个版本:

"""

class Animal:

def speek(self):

pass

def eat(self):

pass

class People(Animal):

def speak(self):

print('say hello')

def eat(self):

pass

class Dog(Animal):

def speak(self):

print('汪汪汪')

def eat(self):

pass

class Pig(Animal):

def speak(self):

print('哼哼哼')

peo1=People()

dog1=Dog()

pig1=Pig()

peo1.speak()

dog1.speek()

pig1.speak()

"""

#可以限定父类的标准,强制子类必须使用相同的speak方法名

import abc

class Animal(metaclass=abc.ABCMeta):

@abc.abstractmethod

def speak(self):

print('animal joiao')

@abc.abstractmethod

def eat(self):

pass

class People(Animal):

def speak(self):

print('say hello')

def eat(self):

pass

class Dog(Animal):

def speak(self):

print('汪汪汪')

def eat(self):

pass

class Pig(Animal):

def speak(self):

print('哼哼哼')

def eat(self):

pass

"""

# 强调第一点:

1.Animal() #强制:父类是用来指定标准的,只是规定一个框架格式,不能被实例化

2.Animal父类中有的方法speak()和 eat子类中也必须要有,名字也必须一致

3.子类中的必要要有和父类一致的函数体标准

"""

#

peo1=People()

dog1=Dog()

pig1=Pig()

#

peo1.speak()

dog1.speak()

pig1.speak()

#实现的目的就是调用时不用考虑是什么物种,直接定义一个函数秩序传动物进去就行

def my_speak(animal):

animal.speak()    #动物.speak() 结果就是个子对应的输出值

my_speak(peo1)  #只需要传动物进去就行

# 概念延伸理解:我们之前也一直在用多态的概念

l=[1,2,3]

s='hello'

t=(1,2,3)

print(l.__len__())

print(s.__len__())

print(t.__len__())

def len(obj):

return obj.__len__()

print(len(l))

print(len(s))

print(len(t))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值