【Python】类与对象进阶

2023-11-12

类与对象有三大特性:封装、多态和继承。其中类和对象之间也涉及到很多的细节和方法:例如方法的分类、对象的权限等等。所有类和对象的进阶还有很多的知识点需要学习。

目录

权限

私有属性和私有方法:

继承

单继承:

多继承:

多态

实例

类与对象的内存理解:

类对象:

类方法:

静态方法:


权限

私有属性和私有方法:

有时候我们创建的一些对象不希望被外界访问到它里面的某些属性或者不希望外界调用它里面的某些方法,这时候我们就需要创建私有属性和私有方法。私有的东西只能在类里面使用,外界不能调用。我们创建私有属性 / 方法的步骤也很简单,就是在属性 / 方法前加上两条下划线,那么这个方法 / 属性就是私有的了。

class Info:
    
    def __myprivate:
       
       print("!")
    
    def __init__(self):
        self.__password = 12345
        self.id = 323
        

Myidcard = Info()
Myidcard.id

此时再去访问就会出错:

   

 但是其实这也不是绝对私有的,如果我们在想访问的私有元素改为: _类名__元素,此时我们就可以访问到了,但是这种做法不推荐使用,这会将原本的私有属性变混乱!


面向对象的编程思想主要有三大核心部分:封装、多态和继承。封装在我们之前就已经提到过,将属性和方法都封装在一个类中,下面我们来看看另外两个思想:多态和继承。


继承

继承就是指一个类可以从另一个类中获得这个类的所有方法和属性,从而使我们在创建有相似属性的类时可以减少很多时间。

单继承:

单继承的定义:

单继承就是指一个子类只从一个父类中继承数据,也就是它只具有一个父类的所有属性。继承的基本语法也很简单,就是直接在子类后面跟上括号括起父类类名就可以继承父类的所有数据。而且单继承中是符合传递性的,也就是说,如果A继承于B,C继承于A,那么C中不仅要A的一切属性和方法还将会有B中的一切属性和方法!!

class Fath:

    def __init__(self):

        self.name = "l"


class Son(Fath):

    pass


KKK = Son()
print(KKK.name) #输出l

扩展和重写父类的方法:

有时侯我们在子类中创建的某些方法是在父类中某些方法基础上扩展开的,或者我们需要对父类某些特定的方法进行重写,这时候我们就需要考虑怎么执行了。

首先是完全重写父类的方法:

完全重写父类的方法只需要在子类中定义一个与需要重写的父类方法重名的子类方法,此时用子类再去调用这个方法,就会默认调用子类的方法而不是父类的方法。

class Fath:

    def __init__(self):

        self.name = "l"

    def idea(self):

        print("now")

class Son(Fath):

    def idea(self):

        print("soon")

son = Son()
son.idea()

而要想对父类的方法进行拓展,我们首先还是需要先重写一个与父类方法重名的新方法,然后再在这个新方法中创建一个特殊对象来调用父类中的方法,具体使用方式是:  super().父类方法    的方式默认创造一个父类的类来调用父类需要扩展的方法。

class Son(Fath):

    def idea(self):

        super().idea()
        print("soon")

父类私有属性 / 方法:

我们知道,一个类中可以创建一些私有的属性或者方法,这些私有属性或者方法是外界访问不到的,只能通过这个类提供的接口来访问。那么我们这时就需要考虑一个问题,父类中的私有方法,子类会继承吗?我们可以做一个例子验证一下:

class S1:

    def __private(self):

        print("private!")

    def public(self):

        print("public!")


class S2(S1):

    def func(self):

        #没有报错
        self.public()
        #报错了
        self.__private()

new = S2()
new.func()

那么我们应该怎么使用和修改父类中的私有属性呢?我们可以在父类中创建一个对外的接口,然后在父类中利用这个接口来进行操作私有属性,然后将接口设为对外的公共方法即可被任何子类所使用。

多继承:

多继承就是一个子类能够继承多个父类,多继承毫无疑问就是单继承的延展。所以多继承的语法也与单继承十分相似,单继承是一个子类后面跟上括号,括号里放着继承于的父类,而多继承的语法则是括号里的父类多增加几个。

class Fath1:
    
    def func1(self):
        
        print("Fath1")
        

class Fath2:
    
    def func2(self):
        
        print("Fath2")
        
class Son(Fath1,Fath2):
    
    pass

这里要注意一点,那就是如果继承自多个父类,要额外注意避免这些父类中出现同名的方法,这样子类在调用这些方法时会带来麻烦。当出现了这种情况,我们也可以利用一个类中的内置属性__mro__来判断是调用哪个类的方法。而且这里是在类外访问类中的内置属性,所以我们应该使用类名来访问

多态

多态,就是指用一个父类去接收我们传进去不同的子类对象,然后父类会根据我们传进去的不同子类对象来选择不同的子类执行方法(方法都要经过重写)。下面有一个例子:首先我们有一个狗类,这个狗类会有两个派生类分别为哈士奇和柴犬,它们都有同一个方法就是game,然后我们再创建一个类,这个类会接收一个狗类的对象,它有一个方法就是去调用这个狗类的对象,然后我们向它传进去不同的狗类的派生类,它就会调用不同的狗类派生类,这种执行方式就是多态。

class Dog(object):

    def game(self):

        print("normal play")


class ChaiDog(Dog):

    def game(self):

        print("Chai play")

class HashiqiDog(Dog):

    def game(self):

        print("hashiqi play")

class Choose:

    def choose(self,dog):
        dog.game()


h = HashiqiDog()
c = ChaiDog()
Mychoice = Choose()
Mychoice.choose(c)
#chai play
Mychoice.choose(h)
#hashiqi play

实例

当我们创建一个类后,我们得到的只是一个模板,而当我们创建一个个对象后,才能得到一个实质性的元素。我们利用类创造出对象的过程就称为实例化,创造出来的一个个对象就是实例

类与对象的内存理解:

对象:首先来看一个个实例出来的对象,毫无疑问,每个对象的属性都是被分开存储的,这样就能不混乱,但是每个对象所用的方法都是一样的,为了不浪费内存,所有对象的方法都是统一存储的。

:类是一个特殊的对象,所有类也会有一份自己的内存空间,类的内存空间存储的不仅是所有实例的方法,还特有类对象自己的属性和方法。

类对象:

类是一个对象,所有类也会有自己的方法和属性。要是我们想要去创造一个类属性,只需要在类里空白位置定义一个变量即可(这与我们对象的属性在__init__函数里创建不同),这个变量就是新的类属性。这个类属性与类实例化出来的对象没关系,只与类本身这个对象有关。一般来说,我们只需要在类名后跟上点就可以看到类对象的属性和方法,其实我们也可以利用对象名后面加点来访问类属性,这种方式其实是取决于Python的向上查找方式寻找属性时先去实例化的对象里查找,找不到就去类对象里查找

class Class(object):
    name = "test_tool"

类方法:

 前面我们说了类的属性,那么类的方法自然而然也不可忽略,类方法的创建于对象方法的创建类似:都是要用参数,只不过这里用参数cls,而对象的参数用的是self。其它的是创造类方法时需要添加一个额外的标识符号@classmethod。同样的,引用类中的对象或者属性我们也可以利用cls加点的方式。

静态方法:

静态方法是除了类方法、实例化对象方法以外的第三种方法。静态方法是指不需要用到类里面的属性 / 方法的一类方法,这类方法我们不需要和具体某一个对象相联系。定义这类方法与定义类方法很类似:这个方法的定义特点是不需要参数,并且需要一个标识符号@staticmethod。因为它是与具体的某一个实例无关,所有调用时与类方法调用类似,直接类名后面跟点调用。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Python】类与对象进阶 的相关文章

随机推荐

  • python重新加载某方法

    20221014 引言 我记得 在很久之前我就弄过这部分内容 当时也是在jupyter notebook中进行实验 然后在这个过程中 需要重新加载某个方法 因为在实验过程中 修改了这个py文件中的函数 整体的思路就是这样 这次也是遇到了这个
  • nginx+ftp实现图片的上传与访问

    1 Nginx的安装 在前面的博客讲到 具体见下面的网址 Nginx的安装 http blog csdn net zbw18297786698 article details 52556293 2 Linux安装ftp组件 2 1 安装vs
  • 随e行创建L2TP 809 错误【一键脚本】

    请下载下面的文件 809 repair zip 右键点击 809 repaire bat 文件 以管理员身份运行 选择 是 根据提示 输入对应字符 yes 以完成对注册表的修改 等待脚本完成对注册表和服务的更改 按任意键退出窗口 809错误
  • LeetCode 热题 HOT 100:链表专题

    LeetCode 热题 HOT 100 https leetcode cn problem list 2cktkvj 文章目录 2 两数相加 19 删除链表的倒数第 N 个结点 21 合并两个有序链表 23 合并 K 个升序链表 141 环
  • windows服务器修改SSL证书友好名称

    系统环境 操作系统 windows 2016 web服务器 IIS 10 修改原因 阿里云上创建的免费证书 友好名称均为alias 在一些集成环境中操作绑定对应站点的SSL证书的时候 可能会因为证书友好名称相同 而找不到对应的SSL证书 操
  • UNIAPP保存base64图片

    制作APP分享二维码 后端生成base64图片 需要前端保存到相册 上代码 saveImgFile base64 base64为base64图片值 const bitmap new plus nativeObj Bitmap test bi
  • Kotlin快速入门

    kotlin kotlin 完全兼容 java 可以和java互相调用 2017年谷歌正式将其作为android开发的第一语言 kotlin编译后产生与java编译后相同的class字节码文件 基础语法 第一个代码 hello world
  • Method的invoke()方法的使用

    public Object invoke Object obj Object args throws IllegalAccessException IllegalArgumentException InvocationTargetExcep
  • idea插件开发入门

    前言 最近想研究一款自动在idea中定位缺陷及发送JIRA的快捷工具 方便提升报自动化脚本的bug的效率 因为idea插件学习是必不可少了 沉淀小结如下 idea插件开发入门 插件用途 工程创建 配置文件 Action实现 开发语法 常用对
  • js三种获取数组的最后一个元素的方法

    一 pop 方法 pop 方法 删除数组最后一个元素 并返回该元素 所以利用这个方法可以取到数组的最后一个 同理shift 可以取到数组的第一个元素 shift 删除数组第一个元素 并返回该元素 let arr 1 2 3 let ele
  • css background image size,html - css background image content size - Stack Overflow

    body margin 0 height 100vh top box text align center height 20 border 1px solid blue background red two area display inl
  • https http 重定向 302 303

    笔者在项目中曾经遇到过这样的情况 就是整个web应用使用的https协议 但是其中某一个表单提交单服务器端 服务器返回了一个重定向的响应 但是此时浏览器直接被拦截 没有做重定向处理 F12打开一看 是因为在https的请求中 混杂着http
  • 解决docker下载安装速度慢的问题

    1 进入etc docker 目录 root iZwz98nzsodcbigjqrrmxmZ cd etc docker 2 在该目录下新建daemon json文件 registry mirrors https docker mirror
  • git 查看远程分支在不同的终端看到的分支不同的解决方法

    多人协作开发的时候 有时候有很多分支 并且在有些分支在a电脑删除之后 在b电脑查看当前分支 居然还有那个被删除掉了的分支 git fetch prune origin 直接执行这行代码 之后再查看一下远程分支 git branch a a
  • SpringBoot在K8s下实现优雅停机

    在K8s中 当我们实现滚动升级之前 务必要实现应用级别的优雅停机 否则滚动升级时 还是会影响到业务 本文介绍SpringBoot应用实现优雅停机 此次教程基于SpringBoot 2 5 0 1 加入必要依赖
  • 简单理解常量、常量池、运行时常量池和字符串常量池

    1 常量 常量在java中就值的是一般的字面量 比如字符串 整数 浮点数等等数据 简单理解java中什么叫常量 2 常量池 也叫静态常量池或者class文件常量池 说常量池一定要指明是编译器产生的 它的组成为字面量和符号引用 3 运行时常量
  • 决策树模型——鸢尾花分类

    构建一个决策树分类模型 实现对鸢尾花的分类 1 lris数据集介绍 鸢尾花数据集是机器学习领域中非常经典的一个分类数据集 数据集全名为 Iris Data Set 总共包含150行数据 每一行由4个特征值及一个目标值 类别变量 组成 其中4
  • 先进API生产力工具eqable HTTP,一站式开发调试工具推荐

    简介 Reqable是什么 Regable Fiddler Charles Postman Reqable是HTTP一站式开发 调试国产化解决方案 拥有更便捷的体验 更先进的协议 更高效的性能和更精致的界面 Reqable是一款跨平台的专业
  • 【日常积累】HTTP和HTTPS的区别

    背景 在运维面试中 经常会遇到面试官提问http和https的区别 今天咱们先来简单了解一下 超文本传输协议HTTP被用于在Web浏览器和网站服务器之间传递信息 HTTP协议以明文方式发送内容 不提供任何方式的数据加密 如果攻击者截取了We
  • 【Python】类与对象进阶

    类与对象有三大特性 封装 多态和继承 其中类和对象之间也涉及到很多的细节和方法 例如方法的分类 对象的权限等等 所有类和对象的进阶还有很多的知识点需要学习 目录 权限 私有属性和私有方法 继承 单继承 多继承 多态 实例 类与对象的内存理解