【python】进阶之面向对象(二)

面向对象的三大特性 : 继承,多态,封装

一、什么是继承

是一种创建新类的方式.在python中,新建的类可以继承一个或者多个父类.
父类也可以称为基类,新建的类称为派生类或子类.
python中类的继承:

#单继承
class ParentClass1:  # 定义父类
pass
class ParentClass2:  # 定义父类
pass
class SubClass1(ParentClass1):  
# 单继承,父类是ParentClass1,子类是SubClass1
pass
class SubClass2(ParentClass1, ParentClass2):
#多继承
pass
'''
猫:吃,喝,爬树
狗:吃,喝,看家
人:吃,喝,走路
动物:吃,喝
'''
 
 
class Animal:
    def eat(self):
        print('吃')
 
    def drink(self):
        print('喝')
 
 
class Cat(Animal):
    def climb(self):
        print('爬树')
 
 
class Dog(Animal):
    def look(self):
        print('看家')
 
 
class Person(Animal):
    def walk(self):
        print('走路')
 
 
# c = Cat()
# c.eat()
# d = Dog()
# d.drink()
# p = Person()
# p.drink()

二、继承和抽象

抽象

1.将对象比较像的部分抽取成类
2.将类比较像的部分抽取成父类.

继承

这是基于抽象的结果,通过编程语言去实现它
先经过抽象这个过程,才能通过继承的方式去表达出抽象的结构.
在开发的过程中,如果定义了一个类A,然后又想新建一个类B,但是类B大部分的内容与A相同,我们不需要重新写B,可以通过继承的方式,让B继承A,那么B就会拥有A所有的属性.

派生

子类可以添加自己新的属性或者在自己这里重新定义这些属性,不会影响到父类.
一旦重新定义了自己的属性且和父类的重名,那么调用时是以自己的类为准的.
在子类中,新建的重名的函数属性,需要用到父类的函数功能时:

1.可以通过super()执行父类的方法

2.如果是在外部调用父类重名的方法,需要给super(子类名,子类对象)传递参数

3.类名.方法名(self)

抽象类

python的抽象类需要借助模块实现
抽象类是一个特殊的类,只能被继承,不能实例化
从设计角度看,如果类是从现实对象抽象而来的,那么抽象类就是基于类抽象而来的.
抽象类和普通的类不同之处:抽象类有抽象方法.不能被实例化,只能被继承,且子类必须实现抽象方法.
import abc
 
 
class File(metaclass=abc.ABCMeta):
    # metaclass:类的类,metaclass的实例就是类
    # abc:抽象父类,主要定义了基本类和基本的抽象方法
    # ABCMeta中会有装饰器,控制了子类继承之后必须完成该抽象方法
    @abc.abstractmethod
    def read(self):
        # # 定义抽象方法,不需要实现,控制子类必须实现
        pass
 
    @abc.abstractmethod
    def write(self):
        pass
 
 
class Txt(File):
    def read(self):
        print('txt的读')
 
    def write(self):
        print('txt的写')
 
 
t = Txt()
t.read()

多继承

类名.__mro__
为了实现继承,python会在mro列表上从左到右开始查找父类,直到找到第一个匹配的为止.
1.子类会先于父类被检查
2.多个父类会根据在列表中的顺序被检查
3.如果在下一个类存在两个选择,则选择第一个父类
class Horse:
    # def test(self):
    #     print('ma')
    pass
 
 
class Lv:
    def test(self):
        print('lv')
 
 
class Luo(Horse, Lv):
    # def test(self):
    #     print('luo')
    pass
 
# luo = Luo()
# luo.test()
 
 
class A:
    def test(self):
        print('A')
 
 
class B(A):
    def test(self):
        print('B')
 
 
class C(A):
    def test(self):
        print('C')
 
 
class D(B):
    # def test(self):
    #     print('D')
    pass
 
class E(C):
    def test(self):
        print('E')
 
 
class F(D, E):
    # def test(self):
    #     print('F')
    pass
 
 
f = F()
f.test()
print(F.__mro__)

接下来,我们进行实战代码------人狗大战

class Animal:
    def __init__(self, name, aggressivity, life_value):
        self.name = name
        self.aggressivity = aggressivity
        self.life_value = life_value
 
    def eat(self):
        print('%s在吃' % self.name)
 
 
class Dog(Animal):
    def eat(self):
        # super().eat()  # super().父类同名方法:执行父类同名方法
        Animal.eat(self)
        print('狗吃')
 
    def bite(self, obj):
        # 派生:狗咬人,人的生命值降低
        obj.life_value -= self.aggressivity
 
# 函数括号内的是形参,实际是个什么东西取决于调用函数时传递的实参
# 所以如果想要对人或者狗对象的属性进行修改,那么就需要传递对象给函数
 
class Person(Animal):
    def attack(self, obj):
        # 派生:人打狗:狗的生命值降低
        obj.life_value -= self.aggressivity
 
 
d = Dog('xiaohei', 10, 1000)
p = Person('tony', 10, 1000)
print(d.name)
print(p.name)
# d.eat()
super(Dog, d).eat()

三、练习

最后,我们进行一个简单的练习:

注意:这是整个一题
1.定义管理员类,管理员有属性(name,password),
可以创建学校、创建课程、创建老师
2.定义老师类,老师有属性(name,password),
可以添加课程、给学生打分,但发现学生没有购买课程时,不能打分,并给出提示
3.定义学生类,学生有属性(name,password),
可以获取当前学校、选择学校、选择课程,但学校没有该课程时,
需要提示,并且不能选择该课程
4.定义学校类,学校有属性(name,addr),可以添加课程
5.定义课程类,课程有属性(name),可以添加学生

答案:

class Admin:
    school_list = []
 
    def __init__(self, name, password):
        self.name = name
        self.password = password
 
    def create_school(self, name, addr):
        school_obj = School(name, addr)
        Admin.school_list.append(school_obj)
        return school_obj
 
    def create_course(self, name):
        course_obj = Course(name)
        return course_obj
 
    def create_teacher(self, name, password):
        teacher_obj = Teacher(name, password)
        return teacher_obj
 
 
class Teacher:
    def __init__(self, name, password):
        self.name = name
        self.password = password
        self.course = []
 
    def add_course(self, course):  # 添加的是课程对象
        self.course.append(course)
        print(f'{self.name}添加了{course.name}课程')
 
    def grade(self, student, course, grade):
        # 给某个学生的某个课程打多少分
        # student和course都是对象
        if course in student.course:
            print(f'{self.name}老师给{student.name}的'
                  f'{course.name}打了{grade}')
        else:
            print(f'{student.name}没有购买{course.name}课程')
 
 
class Student:
    def __init__(self, name, password):
        self.name = name
        self.password = password
        self.school = ''
        self.course = []
 
    def get_school(self, admin):
        for i in admin.school_list:
            print(f'当前学校有{i.name}')
 
    def choose_school(self, school):
        # 传入一个学校对象
        self.school = school
        print(f'{self.name}选择了{school.name}')
 
    def choose_course(self, course):
        if course in self.school.course:
            self.course.append(course)
            print(f'{self.name}选择了{course.name}')
        else:
            print(f'{self.school.name}没有{course.name}课程')
 
 
class School:
    def __init__(self, name, addr):
        self.name = name
        self.addr = addr
        self.course = []
 
    def add_course(self, course):
        # course是个对象
        self.course.append(course)
        print(f'{self.name}学校添加了{course.name}课程')
 
 
class Course:
    def __init__(self, name):
        self.name = name
        self.student = []
 
    def add_student(self, student):
        self.student.append(student)
        print(f'{self.name}{student.name}学生选择')
 
 
admin = Admin('张三', '123')
# 管理员创建学校
bd = admin.create_school('北大', '北京')
fd = admin.create_school('复旦', '上海')
# 管理员创建课程
yw = admin.create_course('语文')
sx = admin.create_course('数学')
yy = admin.create_course('英语')
# 管理员添加老师
lisi = admin.create_teacher('李四', '123')
wangwu = admin.create_teacher('王五', '123')
# lisi添加课程
lisi.add_course(yw)
# 学生
s = Student('tony', '123')
s.get_school(admin)  # 获取学校
s.choose_school(bd)  # 选择学校
# 学校添加课程
bd.add_course(yw)
bd.add_course(sx)
fd.add_course(sx)
fd.add_course(yy)
# 学生选择课程
s.choose_course(yy)
s.choose_course(yw)
# 老师给学生的课程打分
lisi.grade(s, yy, 80)
lisi.grade(s, yw, 80)

关于Python的知识今天就到这里啦,后续我会为大家讲解更多非常有用的知识哦~
关注我,带你领略Python的风采~😍😍😍

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌上~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值