python语法--面向对象基础(19)

2023-11-03

1.初识面向对象

1.1 面向过程

面向过程:根据业务逻辑从上到下写代码。开发过程的思路是将数据与函数按照执行的逻辑顺序组织在一起,数据与函数分开考虑,面向过程基本是由函数组成的。

特点:
注重步骤与过程,不注重职责分工
如果需求复杂,代码会变得很复杂
开发复杂项目,没有固定的套路,开发难度很大!

1.2 面向对象

特点:
注重 对象和职责,不同的对象承担不同的职责。
更加适合应对复杂的需求变化,是专门应对复杂项目开发,提供的固定套路。
需要在面向过程基础上,再学习一些面向对象的语法。

2. 类和对象

2.1 类

类是对一群具有相同特征或者行为 的事物的一个统称,是抽象的,不能直接使用。类里包括属性和方法。所谓属性就是该类的特征,而方法就是该类可以执行的动作。

类的定义:

       class 类名:   类名首字母大写

2.1.1 属性

python支持动态添加属性,谁创建对象,self就指向谁。属性可以是系统类型,也可以是自定义的类型。

类属性:直接在该类下定义的属性,即 变量名 = 值。
设置类属性:类名.属性名 = 值, 如果有该属性就修改,没有就新建该属性。
只要修改类属性,其余为未修改对象属性的对象的该属性都将改变。
类属性可以通过类对象和实例对象访问。

尽量避免类属性和实例属性同名。如果有同名实例属性,实例对象会优先访问实例属性。
类属性只能通过类对象修改,不能通过实例对象修改。
类属性也可以设置为私有,前边添加两个下划线。

对象属性:
设置对象属性:对象名.属性名 = 值, 如果有该属性就修改,没有就报错。
只要一经修改对象属性,无论类属性如何改变,该对象的该属性都不会改变。
上述方法给对象添加属性,可能会出现问题。所以引入__init__方法.

私有属性只能在类体内部使用或者调用各种方法才能使用,外界不能直接通过 对象名。属性名 来使用。格式为,__属性名,python将私有属性改名为_类名__属性名来隐藏该属性,使外界无法访问。也可以通过 对象名._类名__属性名来访问私有属性,但是强烈不建议这样使用。

2.1.2 方法

哪个对象调用了方法,方法里的self指的就是谁。 通过 self.属性名 可以访问到这个对象的属性;通过 self.方法名() 可以调用这个对象的方法。

对象方法:只能通过对象来调用

类方法: 对象方法上加@classmethod装饰器,将self改为cls。

             调用:  类名。方法名()
                    对象名。方法名()

静态方法:对象方法上加@staticmethod装饰器,无需加self、cls。不依赖类

调用:

              类名。方法名()
              对象名。方法名()

2.2 对象

对象是由类创建出来的一个具体存在,可以直接使用属性名。由哪一个类创建出来的 对象,就拥有在哪一个类中定义的属性和方法。只要创建对象,就为其分配一个内存空间。

创建对象的语法:

          对象变量名 = 类名()

使用dir函数查看对象的所有方法:

格式:

           print(dir(对象名))

2.3 类和对象的关系

类是模板,对象是根据类这个模板创建出来的,应该先有类,再有对象。
使用同一个类,能够创建出很多对象。
类中定义了什么属性和方法,对象中就有什么属性和方法。
不同对象对应的属性值也会不同。

3. 魔法方法

3.1 __init__方法

init()方法,在创建一个对象时默认被调用,不需要手动调用。在开发中,如果希望在创建对象的同时,就设置对象的属性,可以对 init 方法进行改造。

注意:

__init__()方法在创建对象时,会默认被调用,不需要手动的调用这个方法。
__init__()方法里的self参数,在创建对象时不需要传递参数,python解释器会把创建好  的对象引用直接赋值给self
在类的内部,可以使用self来使用属性和调用方法;在类的外部,需要使用对象名来使用属性和调用方法。
如果有多个对象,每个对象的属性是各自保存的,都有各自独立的地址。
方法是所有对象共享的,只占用一份内存空间,方法被调用时会通过self来判断是哪个   对象调用了实例方法。

3.2__ str__方法

__str__方法返回对象的描述信息,使用print()函数打印对象时,其实调用的就是这个对象的__str__方法。

3.3 __del__方法

当删除对象时,python解释器也会默认调用一个方法,这个方法为__del__()方法。

3.4__ new__方法

创建对象时调用该魔法方法,先于init调用。它在内存申请了一个空间,供对象使用。

3.5__mro__方法

主要用于在多继承时判断方法属性的调用顺序。

new、init的区别:

 new方法需要一个返回值,返回创建的实例对象,init不需要返回值
 new负责对象的创建,而init负责对象的初始化
new创建对象时调用,会返回当前对象的一个实例,而init是创建完对象后调用,对当前对象进行初始化
在类中new,init同时存在优先调用new
如果__new__返回一个对象的实例,会隐式调用__init__

4.面向对象的特点

4.1 封装

私有属性,通过定义共有的set和get方法来获取和修改私有属性,为封装。

通过@property实现封装:

可以简化对象属性的获取和赋值,通过 对象名。属性获取属性值,通过对象名。属性 = 新值 来设置属性。

封装步骤:

          @property
          def 属性名(self):
                  return self.__xxx

          获取私有属性值: 对象名.属性 = 值
         
          @属性名.setter
          def 属性名(self,yyy):
                  if  条件:
                       self.__xxx = yyy
                  else:
                        代码块
                        
          修改私有属性:对象名.属性名 = 新值

4.2 继承

继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等。继承描述的是多个类之间的所属关系。

子类只能继承父类非私有的属性和方法

当子类和父类有相同的方法或者属性,优先使用子类自己的。

在子类里一个方法调用了另一个方法,而此方法在子类和父类中都有,优先调用子类的方法。如果要使用父类的方法,使用super().方法名()。

继承的传递性:子类拥有父类以及父类的父类中封装的所有属性和方法。

重写:当父类中的方法不能满足子类的需求,需要自己定义一个与父类同名的方法。当调用该方法时,优先调用子类的方法。如果要使用父类的方法,使用super(子类名,self).父类方法名()。

子类要新加属性时,需要重新声明父类的属性,格式如下

  class Worker(Person):
          def __init__(self,id,name,salary,hours,money):
                       super(Worker,self).__init__(id,name,salary)
                       self.hours = hours
                       self.money = money

语法:

                class 类名(父类名):
                       pass

多继承

格式:

           class 子类名(父类名1,父类名2...)
                  pass

注意:

当多个父类中有同名的方法或者属性,使用该方法或者属性时优先使用先传入的父类,所以应该避免使用多继承。

可以使用__mro__查看在多继承时方法属性的调用顺序。

                 print(类名.__mro__)

新式类:继承object,python3.x都是新式类,优先使用广度优先搜索

4.3 多态

不同的子类调用相同的父类方法,产生不同的执行结果,可以增加代码的外部灵活度。多态是以继承和重写父类方法为前提的,它是一种调用方法的技巧,不会影响到类的内部设计。

5.练习

在这里插入图片描述

class Pet:
    type = '宠物'

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

    def __str__(self):
        return '当前类型是{},宠物名{}'.format(self.type, self.name)


class Dog(Pet):
    type = '狗'

    def see_home(self):
        print('我能看家')


class Cat(Pet):
    type = '猫'

    def catch_mouse(self):
        print('我能抓老鼠')


class Petshop:

    def __init__(self, name):
        self.name = name
        self.petlist = []

    def add_pet(self, pet):
        if isinstance(pet, Pet):
            self.petlist.append(pet)
            print('宠物添加成功')
        else:
            print('不是宠物,无法添加。')

    def sale_pet(self, pet):
        if isinstance(pet,Pet):
            self.petlist.remove(pet)
            print('宠物卖成功')
        else:
            print('不能卖非宠物')

    def show_all(self):
        print('宠物商店宠物信息:')
        for pet in self.petlist:
            print(pet)

    def search_pet(self, pname):
        for pet in self.petlist:
            if pet.name == pname:
                print('宠物在商店中')
                break
        else:
            print('不存在该宠物!')



p = Petshop('华联宠物商店')


c = Cat('mao', 2, '白色')
d = Dog('gou',5,'黄色')
p.add_pet(c)
p.add_pet(d)
p.sale_pet(c)
p.show_all()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python语法--面向对象基础(19) 的相关文章

随机推荐

  • 算法讲解:二分图匹配【图论】

    二分图匹配 自然要先从定义入手 那么二分图是什么呢 二分图 二分图又称作二部图 是图论中的一种特殊模型 设G V E 是一个无向图 如果顶点V可分割为两个互不相交的子集 A B 并且图中的每条边 i j 所关联的两个顶点i和j分别属于这两个
  • 前端工程师必须收藏的 JavaScript 资源大全

    我想很多程序员应该记得 GitHub 上有一个 Awesome XXX 系列的资源整理 awesome javascript 是 sorrycc 发起维护的 JS 资源列表 内容包括 包管理器 加载器 测试框架 运行器 QA MVC框架和库
  • Go语言的JSON 库

    1 Go语言的JSON 库 Go语言自带的JSON转换库为 encoding json 1 1 其中把对象转换为JSON的方法 函数 为 json Marshal 其函数原型如下 func Marshal v interface byte
  • innodb的锁

    一致性锁定读和一致性非锁定读 Read Committed和Repetable Read级别下采用MVCC 实现非锁定读 但在一些情况下 要使用加锁来保障数据的逻辑一致性 自增列 锁的算法 唯一值 MySQL 中关于gap lock nex
  • qt delegate 委托 多级联动 小结

    最近使用qt写程序用到了treewidget和tablewidget 涉及到编辑默认情况下可以设置treewidget和tablewidget的item可编辑属性来进行编辑 默认情况只是简单的文本输入格式 在qt的demo中看到了spin
  • ES6详解(持续更)

    前言 之前对ES6也有过学习使用 但是都没有深入系统去看看文档书籍 这里开始对一些ES6语法进行整理总结 本文基于阮一峰ES6入门 线上地址 阮一峰ES6入门 let和const命令 1 let命令 如果使用let 声明的变量仅在块级作用域
  • android之adb connect手机设备

    adb手机连接是Android开发过程中常用的 也可以通过无线wifi来连接手机 但是百度搜索了一大堆资料都不全面 而且认知还不全面 导致浪费生命 有时候浪费个人的时间反而更加惹人恶心 window10电脑adb环境搭建 错误提示 adb
  • 人工智能入门学习笔记(一)

    家人们 好久不见哈 最近在尝试着学习人工智能的相关知识和具体技能呀 说实话 当像我这样的 小白初探人工智能体系时 总是被很多未知的名词以及茫茫内容所淹没 便去想通过网络学习帮助自己建立正确的人工智能基本概念认知 在此 我便进一步对人工智能体
  • Token的验证流程以及用法

    一 身份验证流程 1 用户向服务器发送用户名和密码 2 服务端收到请求 去验证用户名与密码 3 验证成功后 服务端会签发一个 Token 将这个 Token 发送给客户端 4 客户端收到 Token 以后可以把它存储起来 放在 Cookie
  • java多线程-Thead线程学习记录笔记

    介绍的内容 主要介绍多线程的基本概念到后面的基本使用 以及一些稍微的原理猜测 个人笔记 不喜勿喷 目录 目录 一 线程使用 1 1 概念 1 2 线程生命周期 1 3 java中实现的方式 1 3 1 继承线程 Thread 1 3 2 实
  • 干货|采用Istio实现灰度发布(金丝雀发布)

    点击上方 中兴开发者社区 关注我们 每天读一篇一线开发者原创好文 灰度发布 又名金丝雀发布 介绍 当应用上线以后 运维面临的一大挑战是如何能够在不影响已上线业务的情况下进行升级 做过产品的同学都清楚 不管在发布前做过多么完备的自动化和人工测
  • unity之shader学习笔记(四)--高光反射

    但是我们会发现物体的背光面是个全黑的颜色 现实生活中物体的背光面并不是全黑的 而是可以看到物体的大概形状 并不是全黑的 之前使用的计算方式是兰伯特光照模型 要实现此种现象 那么就需要使用半兰伯特光照模型来实现 半兰伯特光照模型 Diffus
  • unity鼠标键盘交互

    鼠标交互之鼠标拖动物体 将代码放置在被拖动的物体上 public Camera mainCamera 相机悬挂 private void OnMouseDrag 拖动物体的碰撞体 Ray r mainCamera ScreenPointTo
  • 我在唯品会工作了四年_苦等两年,唯品会消金牌照终于批了,金融业务却“掉队”了...

    图片来源 视觉中国 记者 邹璐徽 界面新闻发现 唯品金融APP即将停用 早前的 唯品宝 唯多利 等金融理财产品也已消失 9月30日 银保监官网发布关于筹建四川省唯品富邦消费金融有限公司的批复 同意在四川省成都市筹建四川省唯品富邦消费金融有限
  • 同时修改多条数据

    想必大家对于可以同时编辑多条数据的事件并不陌生吧 下面我来给大家分享一下可以同时修改多条数据的方法 首先我们看一下我们要处理的是 一个菜品的厨打方案 我们的目的是将批处理方案 也就是同时修改多条数据 也就是把图片中的厨打厨打到区域厨打方案都
  • Hive 核心原理(hive-3.1.2)(转载)

    一 Hive 概述 1 1 Hive 是什么 由Facebook开源用于解决海量结构化日志的数据统计 基于Hadoop的一个数据仓库工具 可以将结构化的数据文件映射成一张表 并且提供类SQL的查询功能 Hive仅仅是一个工具 本身不存储数据
  • Linux系统重新生成boot,在fedora 28中重新生成/boot/grub2/grub.cfg,解决grub问题

    在电脑里安装了windows 7和fedora 28做双系统 现在需要删除掉其中的windows 7系统 在格式化硬盘后 还需要更新grub2的启动选项 删除grub启动界面原来的windows 7选项 以下为方法 grub硬盘启动选项是由
  • Modbus TCP读取寄存器数据

    modbus4j读取寄存器数据 ModbusReadUtil读取工具类 package cn sync modbus import org apache log4j Logger import com serotonin modbus4j
  • OS 关于信号量处理中的忙等待问题

    直接看图 下面这张图堪称神奇 问题描述 gt 套娃行为 信号量为了时临界区问题不发生忙等待 使用临界区mutex进行处理 临界区mutux的value需要被P1和P2的wait 指令进行操作 然而能否保证对mutex value进行互斥的操
  • python语法--面向对象基础(19)

    1 初识面向对象 1 1 面向过程 面向过程 根据业务逻辑从上到下写代码 开发过程的思路是将数据与函数按照执行的逻辑顺序组织在一起 数据与函数分开考虑 面向过程基本是由函数组成的 特点 注重步骤与过程 不注重职责分工 如果需求复杂 代码会变