Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >类与对象,类的继承,类的派生,类的组合,多态

类与对象,类的继承,类的派生,类的组合,多态

作者头像
小小咸鱼YwY
发布于 2019-07-24 07:55:49
发布于 2019-07-24 07:55:49
1.2K00
代码可运行
举报
文章被收录于专栏:python-爬虫python-爬虫
运行总次数:0
代码可运行

面向对象编程

1.类与对象

python中先有类再有对象,类和对象,你可以看成,类是把对象的相同特征和相同方法汇总再一起,再根据类来生成对象,这个对象具有类的特征与方法

1.类的命名

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class 类名:#这里类名必须用驼峰体进行命名有些特殊情况除外
    name = a #特征
    def __init__(self): self #对于生成的对象来说是生成的对象,对于类来说是个要传的形参,且__init__在运行类的时候他会调用函数
        pass
    def func():#func为方法.其在命名对象时候不会进行调用
        pass
类的调用
对象 = 类名()

2.对象的查找顺序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#先查找对象他本身,如果没有,再去类里面找,如果还没有就报错
#一.自身有类也有
class a:
    name = 'sb'
    def __init__(self,name):
        self.name = name
        
b = a('2b')
print(b.name)
#结果是2b
#自己没有类有
class a:
    name = 'sb'
    def __init__(self,name):
        self.xx = name
b = a('2b')
print(b.name)
#结果是sb        

3.生成好后的对象进行值修改

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.把对于的值取出来再进行赋值修改,或者直接生成一个同名的对象把原来的覆盖掉

2.类的继承

1.父类,子类

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

2.继承写法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class fu:
    print('from fu')
class son(fu): #命名中()内的内容则是这个类的其相对的父类,不进行处理默认传无参的父类
    pass
a = son()
print(a)
#from fu

3.查找顺序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#先查找对象他本身,如果没有,再去类里面找,如果还没就去父类的本身找,在去父类的类中找,以此类推.直到没有会报错
#菱形继承除外

3.类的派生

在父类和子类的基础上,子类再父类的基础上需要有更多的特征的时候这时候我们引入的派生

1.只有一个父类的时候

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class fu:
    def __init__(self,name,age,money):
        self.name = name
        self.age = age
        self.money = money

#在他子类我们要加个车选项
#第一种写法
class son(fu):
    def __init__(self,name,age,money,car):
        super().__init__(name,age,money)
        self.car = car
son_1 =son(1,2,3,4)
print(son_1.car)
#第二种写法
'''
严格以来继承属性查找关系
super()会得到一个特殊的对象,该对象就是专门用来访问父类中的属性的(按照继承的关系)
super().__init__(不用为self传值)
super的完整用法是super(自己的类名,self),在python2中需要写完整,而python3中可以简写为super()
'''
class son(fu):
    def __init__(self,name,age,money,car):
        super(son,self).__init__(name,age,money)
        self.car = car
son_1 =son(1,2,3,4)
print(son_1.car)

2.有多个父类的时候

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class FuOne:
    def __init__(self,name,age):
        self.name = name
        self.age = age
class FuTwo:
    def __init__(self,money):
        self.money = money

class Son(FuOne,FuTwo): #不进行处理默认传无参的父类
    def __init__(self,name,age,money):
    # super(Son, self).__init__(naem,age)等效与FuOne.__init__(FuOne,name,age)让父类不为无参
    #super我能力有限,只能做到他取第一个父类,没法做到他取第二个父类,可能他只能取第一个父类
        FuOne.__init__(FuOne,name,age)
        FuTwo.__init__(FuTwo,money)
son = Son(1,2,3)
print(son.money)

#不做处理
class FuOne:
    print('123')
    def __init__(self,name,age):
        self.name = name
        self.age = age
class FuTwo:
    print('123')
    def __init__(self,money):
        self.money = money

class Son(FuOne,FuTwo): #不进行处理默认传无参的父类,且自动导入了第一个,需要传和第一个一样的参数个数
    pass
'''
123
123
'''

4.类的组合

主要就是通过类的方法进行组合,而且方法内传的是类名

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 组合:组合在一起
# 简单的选课系统
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):  # python对象
        self.course = course  # 组合  # 把对象当作变量值来用,当作形参/实参/返回值。
        print(f'{self.name}选课{course.name}成功')


class 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}')


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


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


# 课程
# python = Course('Python', '8888')
# linux = Course('Linux', '6666')

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

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

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

# 业务逻辑

# 1. 创建课程
python = egon.create_course('python', '8888')
print(python.__dict__)
linux = egon.create_course('linux', '6666')
print(linux.__dict__)

# 2. 学生选择课程
zhubajie.choose_course(python)


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

5.多态

1.定义

多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承)

  1. 序列数据类型有多种形态:字符串,列表,元组
  2. 动物有多种形态:人,狗,猪

2.使用示范

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()
pig2.talk()
d2.talk()

3.注意事项

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
注意:多态与多态性是两种概念

多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-06-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Centos 7 升级内核版本为 5.12.11​
为了 Docker、Kubernetes 运行稳定,升级 Centos 7 内核版本为 5.12.11。
叨叨软件测试
2021/07/16
2.9K0
CentOS7 升级最新内核
yum 方式升级到最新版 导入 elrepo 仓库 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm 列出可用的内核相关包 # kernel-lt:长期支持版本,用于修复旧版内核的 BUG,这些内核只会修复重大 BUG,并且不会频繁发布版本。 # kernel-ml:最新稳定版本 yum --d
陳斯托洛夫斯記
2022/10/27
2.4K0
CentOS7 升级最新内核
Centos 7 升级系统内核
我们使用 Linux 来表示整个操作系统,但严格地来说,Linux 只是个内核。各种发行版(RedHat、ubuntu、CentOS等)是一个完整功能的系统,它建立在内核之上,具有各种各样的应用程序工具和库。
玖柒的小窝
2021/12/09
1.5K0
Centos内核版本升级
内核进行的是应用软件和计算机硬件的交互工作在计算机科学中,内核(英语:kernel)又称核心,是一个计算机程序,用来管理软件发出的数据I/O(输入与输出)要求,将这些要求转译为数据处理的指令,交由中央处理器(CPU)及计算机中其他电子组件进行处理,是现代操作系统中最基本的部分。 它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并由内核决定一个程序在什么时候对某部分硬件操作多长时间。直接对硬件操作是非常复杂的。所以内核通常提供一种硬件抽象的方法,来完成这些操作。通过进程间通信机制及系统调用,应用进程可间接控制所需的硬件资源(特别是处理器及IO设备)。
惨绿少年
2019/07/02
3.7K0
centos7升级内核从3到4或从3到5
//升级内核,参考https://elrepo.org/linux/kernel/el7/x86_64/RPMS/ 里显示的 elrepo-release的版本进行如下第2步的安装
Windows技术交流
2019/12/25
1.4K0
Centos系统升级内核
🎈 作者:互联网-小啊宇 🎈 简介: CSDN 运维领域创作者、阿里云专家博主。目前从事 Kubernetes运维相关工作,擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护等领域。 🎈 博客首页:CSDN【互联网-小阿宇】 、阿里云【互联网-小阿宇】 🎈 欢迎小伙伴们点赞👍、留言💬 ⭐Centos系统升级内核 🎈查看现在的内核版本 🎈查看 yum 中可升级的内核版本 🎈导入ELRepo软件仓库的公共秘钥 🎈Centos系
互联网-小阿宇
2023/04/01
1.7K0
Centos系统升级内核
CentOS7升级内核
安装导入包 rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm rpm -import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org 查看可用内核版本 yum --disablerepo="*" --enablerepo="elrepo-kernel" list available 安装4版本kernel-lt内核 yum -y --enablerepo=elrep
院长技术
2020/12/10
1.3K0
CentOS 7/6系统升级内核版本到5.2.2
由于公司服务器新业务需要,需要将CentOS 7系统的内核(3.10.0-229)进行升级。
用户1679793
2019/07/25
7.3K0
linux 实现centos7在线升级最新版本内核
Kernel  (内核)是操作系统的核心,掌握所有硬件设备的控制权,也就是说,你所希望计算机帮你完成的各项工作,都需要通过内核的帮助才能完成,当然,如果我们想完成的某个功能是内核没有的,则内核不会操控计算机来帮你完成这项工作,如果我们想让内核去完成这个功能,那么我们就必须将该功能的模块添加到内核当中,这就类似于驱动程序,有了这样一个“驱动程序”的支持后,我们的硬件才能完成之前所不能完成的功能。
用户4877748
2020/07/22
2.6K0
linux 实现centos7在线升级最新版本内核
CentOS 6/7升级最新内核并开启Google BBR
Google BBR是一款TCP加速工具,但要求Linux内核必须大于4.9,之前分享过文章《CentOS一键升级内核并开启Google BBR》,这个方法虽然方便,但是发现在Raksmart上升级失败了,于是尝试手动升级内核。
星哥玩云
2022/08/13
5540
CentOS 6/7升级最新内核并开启Google BBR
CentOS在线升级内核
升级内核需要使用 elrepo 的yum 源首先我们导入 elrepo 的key  rpm –import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org 升级内核需要使用 elrepo 的yum 源 首先我们导入 elrepo 的key RHEL-7, SL-7 or CentOS-7: rpm –import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org RHEL-6
一夕如环
2018/04/03
2.8K0
Centos7.x升级内核版本
https://elrepo.org/linux/kernel/el7/x86_64/RPMS/
用户6792968
2022/08/30
7260
Centos7.x升级内核版本
CentOS7.x系统配置记录
建议使用阿里云的源其他发行版等同:http://mirrors.aliyun.com/help/centos
全栈工程师修炼指南
2020/10/26
2.2K0
CentOS7.x系统配置记录
CentOS7修改内核版本
因为研究测试fabric需要安装docker,而docker又对linux内核版本有要求,因此对测试的机器内核升级,以下为整理的内核升级方法步骤,忘指正。
用户4988376
2021/07/21
2K0
CentOS7.X更新最新版本内核,解决BBR内核导致的无法编译安装!
wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-ml-5.5.9-1.el7.elrepo.x86_64.rpm
QUXINGDONG.COM
2020/03/12
2.9K0
CentOS7.X更新最新版本内核,解决BBR内核导致的无法编译安装!
CentOS7.x系统配置记录
建议使用阿里云的源其他发行版等同:http://mirrors.aliyun.com/help/centos
全栈工程师修炼指南
2022/09/28
1.2K0
CentOS7.x系统配置记录
CentOS6内核太老更新内核
title: CentOS6内核太老更新内核 date: 2020-04-01 23:31:42 tags: [CentOS] categories: [CentOS]
JaneYork
2023/10/11
4610
CentOS6内核太老更新内核
CentOS7升级内核
ELRepo 仓库是基于社区的用于企业级 Linux 仓库,提供对 RedHat Enterprise (RHEL) 和 其他基于 RHEL的 Linux 发行版(CentOS、Scientific、Fedora 等)的支持。 ELRepo 聚焦于和硬件相关的软件包,包括文件系统驱动、显卡驱动、网络驱动、声卡驱动和摄像头驱动等。
晓果冻
2022/09/08
4820
CentOS7.x系统内核升级到最新版
下面这个脚本,请直接全部复制,然后进入到linux内,自行创建一个sh文件,然后执行
华创信息技术
2022/05/28
3540
Centos7升级内核
1.首先去清华的TUNA或者中科大的USTC的elrepo下载适合自己的内核rpm包,我的是64位的,地址如下:
缘、妙不可言
2019/09/09
2.1K0
相关推荐
Centos 7 升级内核版本为 5.12.11​
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验