Python高级一

一、介绍

        1、特点

            面向对象 

                   对象:对客观事物的抽象

                            对一个具体事务的存在,现实生活中可以看得见摸得着的

                            可以直接使用的

        2、类和对象的关系

                类:对对象的抽象

                        具有相似内部状态和运动规律的实体的集合(或统称为抽象)       

                        具有相同属性和行为事物的统称

                类∶是创建对象的模板
                对象︰是依据类产生的一个具体实例

二、类

           self的介绍

        1、类的定义

                在Python中,使用class关键字定义一个类。类名通常采用大驼峰命名法(即每个单词首字母大写,其余小写)。类可以包含属性(变量)和方法(函数)。

        2、类的创建

        示例

class Hero:         #定义一个类
    hp = "我快没血了"    #定义成员变量  不建议使用,只读不可修改
    def printmsg(self):        #定义一个成员函数 , self相当于this指针
        print("我是提莫我快乐")    #函数体

#类的使用
timo = Hero()              #定义一个类对象
timo.printmsg()            #类对象调用函数
print(timo.hp)

        输出结果

          3.对象的添加

        示例

class Hero:         #定义一个类

    hp = "我快没血了"    #定义成员变量  不建议使用,只读不可修改
    def printmsg(self):  # 定义一个成员函数 , self相当于this指针
        print("我是提莫我快乐")  # 函数体

timo = Hero()              #定义一个类对象
timo.printmsg()            #类对象调用函数
print(timo.hp)
#添加对象
timo.name = "提莫"
timo.age = 18
print("名字:{}, 年龄: {}".format(timo.name, timo.age))

        结果

        4、魔法方法

                1)定义

                在Python中,魔法方法(也称为特殊方法)是以双下划线(__)开头和结尾的方法,它们提供了一种方式来实现和修改对象的内置行为。这些方法允许开发者对Python的内置操作进行自定义实现,比如算术运算、项访问、属性访问、字符串表示等。

                2)魔法方法的使用

        a、__init__(self,[...]):   构造器
class Hero:         #定义一个类
    #魔法方法: __init__(self): 构造器,相当于析构函数
    def __init__(self):
        self.jn = "大招"


timo = Hero()
print("技能:{}".format(timo.jn))

    

class Hero:         #定义一个类
    #魔法方法: __init__(self): 构造器,相当于析构函数
    def __init__(self, name = "提莫", age = 18, hp = 1800):
        self.jn = "大招"
        self.name = name
        self.age = age
        self.hp = hp

timo = Hero()
print("姓名:{}, 年龄:{}, 血量:{},技能:{}".format(timo.name, timo.age, timo.hp, timo.jn))

        b、__del__(self) :析构器

                它在对象生命周期结束时被调用,用于执行对象的清理工作。

class Hero:         #定义一个类
    #魔法方法: __init__(self): 构造器,相当于析构函数
    def __init__(self, name = "提莫", age = 18, hp = 1800):
        self.jn = "大招"
        self.name = name
        self.age = age
        self.hp = hp
        print("对象创建成功")
    def __del__(self):
        print("对象消除成功")
timo = Hero()
print("姓名:{}, 年龄:{}, 血量:{},技能:{}".format(timo.name, timo.age, timo.hp, timo.jn))

三、类的继承

        1、单继承

        在面向对象编程中,单继承指的是一个子类(派生类)仅继承自一个父类(基类)。这种继承机制允许子类获取父类的属性和方法,同时也可以添加或修改属性和方法,以实现特定的功能

        示例

#定义父类
class Parent:         #定义一个类
    #魔法方法: __init__(self): 构造器,相当于析构函数
    def __init__(self):
        self.val = "我是父类属性"

    def __del__(self):
        print("父类对象消除成功")

    def show(self):
        print("{}".format(self.val))

#定义派生类确定继承关系
class Child(Parent):
    def __init__(self):
        # 调用父类的__init__方法
        super().__init__()
        self.childVal = "我是子类属性"

    def show1(self):
        print(self.childVal)
    def __del__(self):
        print("派生类对象消除成功")

# 创建子类实例
child = Child()
# 调用继承自父类的方法
child.show()  # 输出: 我是父类属性
# 调用子类的方法
child.show1()  # 输出: 我是子类属性

        在子类中,super()函数是一个特殊的函数,它返回的是一个临时对象,该对象允许你调用父类中定义的方法。最常见的用途是在子类中调用父类的初始化方法__init__,就像上面的示例那样。这样做可以确保父类被正确地初始化

        2、多继承

        虽然单继承使得继承关系更加简单和清晰,但它也有其局限性。在某些情况下,一个类可能需要从多个源继承属性和方法,单继承无法满足这种需求。Python 为此提供了多继承机制,允许一个类同时继承多个父类,以覆盖单继承的这一局限性。

        示例

#定义父类
class Parent1:
    def __init__(self):
        self.val = "我是父类属性一"
    def show1(self):
        print("{}".format(self.val))

class Parent2:
    def __init__(self):
        self.val = "我是父类属性二"
    def show2(self):
        print("{}".format(self.val))

#定义派生类确定继承关系
class Child(Parent1, Parent2):
    def __init__(self):
        # 调用父类的__init__方法
        super().__init__()
        self.childVal = "我是子类属性"

    def show(self):
        print(self.childVal)
    def __del__(self):
        print("派生类对象消除成功")

# 创建子类实例
child = Child()
# 调用继承自父类的方法
child.show1()  # 输出: 我是父类属性一
child.show2()  # 输出: 我是父类属性二
# 调用子类的方法
child.show()  # 输出: 我是子类属性

        3、私有继承

                在面向对象编程中,私有继承是一种特殊的继承方式,它允许子类继承父类的实现细节,包括私有成员和保护成员。私有继承并不常见,因为它通常会导致紧耦合的代码,使得子类与父类之间过于依赖。

                在Python中,没有直接支持私有继承的语法。Python中的继承是默认公有继承,即子类可以访问父类的公有成员(公有方法和属性),但不能直接访问父类的私有成员。

然而,通过一些技巧,可以模拟私有继承的效果

        示例

class Parent1:
    def __init__(self):
        self.public_var = "Public"  #公有
        self._protected_var = "Protected"   #保护
        self.__private_var = "Private"        #私有

    def public_method(self):
        print("This is a public method")

    def _protected_method(self):
        print("This is a protected method")

    def __private_method(self):
        print("This is a private method")


class Child(Parent1):
    def __init__(self):
        super().__init__()
    def access_base_members(self):
        # 可以访问父类的公有成员
        print(self.public_var)  # 输出: Public
        # 可以访问父类的保护成员
        print(self._protected_var)  # 输出: Protected
        # 不能直接访问父类的私有成员
        # print(self.__private_var)  # 报错
    def call_base_methods(self):
        self.public_method()  # 可以调用父类的公有方法
        self._protected_method()  # 可以调用父类的保护方法
        # self.__private_method()  # 报错,无法调用父类的私有方法

child = Child()
child.access_base_members()
child.call_base_methods()

        4、私有继承@property用法

                在 Python 中,@property 装饰器用于将类的方法转换为属性,从而实现对属性的访问和设置时可以执行特定的逻辑。使用 @property 装饰器可以使代码更具可读性和易用性。

           示例

class Demo:
    def __init__(self, name, age, sex):
        #__开头的变量名为 私有成员, 在类的外部不能被直接访问
        self.__name = name
        self.age = age
        self.sex = sex
    @property  #@property :修饰得函数,用来获取私有属性的值  类外部直接使用 obj.函数名 进行使用
    def value(self):
        return self.__name
    @value.setter  #@value.setter :修饰value函数,用来设置私有属性的值  类外部直接使用 obj.函数名 = 数值 进行使用
    def value(self, name):
        self.__name = name

if __name__ == '__main__':
    obj = Demo("盲僧", 18, "女")
    print(obj.age, obj.sex)

    #普通的访问操作私有属性
    obj.value = "蛮王"
    print(obj.value)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/437475.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

专治Java底子差,线程操作篇(1)

💗推荐阅读文章💗 🌸JavaSE系列🌸👉1️⃣《JavaSE系列教程》🌺MySQL系列🌺👉2️⃣《MySQL系列教程》🍀JavaWeb系列🍀👉3️⃣《JavaWeb系列教程》…

OA系统看飞书,能把繁杂场景设计的这么流畅,绝对是高手。

OA系统看飞书,能把繁杂场景设计的这么流畅,绝对是高手。 2023-08-18 23:33贝格前端工场 飞书是一款功能强大、操作流畅的企业协作工具,它提供了丰富的功能和灵活的场景设计,使得用户在使用过程中能够更加高效地协作和沟通。 以…

开放式高实时高性能PLC控制器解决方案-基于米尔电子STM32MP135

前言 随着工业数字化进程加速与IT/OT深入融合,不断增加的OT核心数据已经逐步成为工业自动化行业的核心资产,而OT层数据具备高实时、高精度、冗余度高、数据量大等等特点,如何获取更加精准的OT数据对数字化进程起到至关重要的作用,…

微服务day06-Docker

Docker 大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题: 依赖关系复杂,容易出现兼容性问题 开发、测试、生产环境有差异 1.什么是Docker? 大型项目组件很多,运行环境复杂,部署时会遇到各种…

Linux - 反弹Shell

概念 Shell 估计大家都不陌生,简单来说,就是实现用户命令的接口,通过这个接口我们就能实现对计算机的控制,比如我们常见的 ssh 就是执行的 Shell 命令实现对远程对服务器的控制。 那反弹 Shell ( Reverse Shell&…

深入浅出(二)MVVM

MVVM 1. 简介2. 示例 1. 简介 2. 示例 示例下载地址:https://download.csdn.net/download/qq_43572400/88925141 创建C# WPF应用(.NET Framework)工程,WpfApp1 添加程序集 GalaSoft.MvvmLight 创建ViewModel文件夹,并创建MainWindowV…

C语言指针(5):strlen与sizeof的区别及指针笔试题练习

1、sizeof和strlen的对比 sizeof sizeof计算变量所占内存内存空间⼤⼩的,单位是字节,如果操作数是类型的话,计算的是使⽤类型创建的变量所占内存空间的⼤⼩。简单来说,sizeof 只关注占⽤内存空间的⼤⼩,不在乎内存中存…

spring-jpa

一、介绍 1.1ORM 1.2 Java Persistence API 放在javaee版本 优点 支持持久化复杂的Java对象,简化Java应用的对象持久化开发支持使用JPQL语言进行复杂的数据查询使用简单,支持使用注解定义对象关系表之间的映射规范标准化,由Java官 方统一规…

K8s Pod控制器

目录 前言: 1.Deployment 查看控制器配置 查看历史版本 2.SatefulSet 安装CoreDNS,仅二进制部署环境需要安装CoreDNS 方法一 方法二 查看statefulset的定义 清单定义StatefulSet 创建pv 定义PV 创建statefulset 滚动更新 总结 扩展伸缩…

PEIS源码 健康体检中心源码 C/S

目录 一、系统概述 二、系统开发环境 三、系统功能 检前管理 检中管理 检后管理 设备对接-PACS 设备对接-彩超 LIS-结果录入、审核、外送结果自动导入 一、系统概述 体检系统,是专为体检中心/医院体检科等体检机构,专门开发的全流程管理系…

学习 考证 帆软 FCP-FineBI V6.0 心得

学习背景: 自2024年1月起,大部分时间就在家里度过了,想着还是需要充实一下自己,我是一个充满热情的个体。由于之前公司也和帆软结缘,无论是 Fine-Report 和 Fine-BI 都有接触3年之久,但是主要做为管理者并…

小火星露谷管理器如何设置N网API KEY

在小火星露谷管理器的设置页面点击设置API KEY,其中描述了如何获取API KEY。 如何获取API KEY? 打开N网NexusMods登录N网账号查看N网的账号详情页的API标签页滑动到网页底部复制Personal API Key 框内的文本 在管理器的设置页面填写API KEY

C语言数据类型详解及相关题——各种奇奇怪怪的偏难怪

文章目录 一、C语言基本数据类型溢出 二、存储原理符号位原码反码补码补码操作的例子 三、赋值中的类型转换常见返回类型——巨坑总结 一、C语言基本数据类型 溢出 因为数据范围(即存储单元的位的数量)的限制,可以表达的位数是有限的。 溢出…

我的创作周年纪念日

机缘 最初成为创作者的初心:整理自己的知识体系,普及前端知识 实战项目中的经验分享日常工作学习过程中的记录通过文章进行技术交流归纳和整理自己的知识体系 收获 创作的过程中收获: 获得了909粉丝的关注获得了很多正向的反馈&#xff0c…

第五十一天| 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

第四十八天| 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II-CSDN博客 第五十天| 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV-CSDN博客 Leetcode 309.最佳买卖股票时机含冷冻期 题目链接:309 最佳买卖股票时机含冷冻期 题干:给定一个…

vue api封装

api封装 由于一个项目里api是很多的,随处都在调,如果按照之前的写法,在每个组件中去调api,一旦api有改动,遍地都要去改,所以api应该也要封装一下,将api的调用封装在函数中,将函数集…

Keepalive 解决nginx 的高可用问题

一 说明 keepalived利用 VRRP Script 技术,可以调用外部的辅助脚本进行资源监控,并根据监控的结果实现优先动态调整,从而实现其它应用的高可用性功能 参考配置文件: /usr/share/doc/keepalived/keepalived.conf.vrrp.localche…

GPT-4技术解析:与Claude3、Gemini、Sora的技术差异与优势对比

【最新增加Claude3、Gemini、Sora、GPTs讲解及AI领域中的集中大模型的最新技术】 2023年随着OpenAI开发者大会的召开,最重磅更新当属GPTs,多模态API,未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义,不亚…

干货分享③:免费制作产品管理系统!

他来了,他来了,他带着码上飞CodeFlying走来了!今天继续为大家带来一期干货分享,教大家如何免费使用码上飞来的开发产品管理系统 ! 一、登陆官网 码上飞 CodeFlying | AI 智能软件开发平台! 点击立即体验注…

代码随想录算法训练营Day38 || leetCode 7509. 斐波那契数 || 70. 爬楼梯 || 746. 使用最小花费爬楼梯

动态规划和我们数电中学习的时序电路类似,某一时刻的状态不仅与当前时刻的输入有关,还与之前的状态有关,所以推导过程中我们需要模拟题目中的情况,来找到每一时刻状态间的关系。 做题思路如下 509. 斐波那契数 此题简单 状态方程…