11Python面相对象基础语法

news2025/1/11 1:01:41

面相对象基础语法

01. dir 内置函数

  • Python对象几乎是无所不在的,我们之前学习的 变量数据函数 都是对象

Python 中可以使用以下两个方法验证:

  1. 使用内置函数 dir 传入 标识符 / 数据,可以查看对象内的 所有属性及方法

提示 __方法名__ 格式的方法是 Python 提供的 内置方法 / 属性

序号方法名类型作用
01__new__方法创建对象时,会被 自动 调用静态方法
02__init__方法对象被初始化时,会被 自动 调用
03__del__方法对象被从内存中销毁前,会被 自动 调用
04__str__方法返回对象的描述信息print 函数输出使用

提示 利用好 dir() 函数,在学习时很多内容就不需要死记硬背了

02. 定义简单的类

面向对象更大封装,在 一个类中 封装 多个方法,这样 通过这个类创建出来的对象,就可以直接调用这些方法了

2.1 定义方法的类

  • Python 中要定义一个只包含方法的类,语法格式如下:
class 类名:

    def 方法1(self, 参数列表):
        pass
    
    def 方法2(self, 参数列表):
        pass
  • 方法 的定义格式和之前学习过的函数 几乎一样
  • 区别在于第一个参数必须是 self

注意:类名 的 命名规则 要符合 大驼峰命名法

2.2 创建对象

  • 当一个类定义完成之后,要使用这个类来创建对象,语法格式如下:
对象变量 = 类名()

2.3 案例

  • 小猫 鱼,小猫
class Cat:
    """这是一个猫类"""

    def eat(self):
        print("小猫爱吃鱼")

    def drink(self):
        print("小猫在喝水")

tom = Cat()
tom.drink()
tom.eat()

03. self 参数

3.1 案例改造 —— 增加属性

  • 在Python中,要给对象设置属性,非常的容易,只需要在 类的外部的代码 中直接通过 . 设置一个属性即可,但是不推荐使用
    • 因为:对象属性的封装应该封装在类的内部

注意:这种方式虽然简单,但是不推荐使用!

tom.name = "Tom"

3.2 使用 self

哪一个对象 调用的方法,方法内的 self 就是 哪一个对象的引用

  • 在类封装的方法内部,self 就表示 当前调用方法的对象自己
  • 调用方法时,程序员不需要传递 self 参数
  • 在方法内部
    • 可以通过 self. 访问对象的属性
    • 也可以通过 self. 调用其他的对象方法
  • 改造代码如下:
class Cat:

    def eat(self):
        print("%s 爱吃鱼" % self.name)

tom = Cat()
tom.name = "Tom"
tom.eat()

lazy_cat = Cat()
lazy_cat.name = "大懒猫"
lazy_cat.eat()
  • 类的外部,通过 变量名. 访问对象的 属性和方法
  • 类封装的方法中,通过 self. 访问对象的 属性和方法
    -

04. 初始化方法

4.1 存在的问题

之前代码存在的问题 —— 在类的外部给对象增加属性

  • 将案例代码进行调整,先调用方法 再设置属性,观察一下执行效果
tom = Cat()
tom.eat()
tom.name = "Tom"
print(tom)
  • 程序执行报错如下:
AttributeError: 'Cat' object has no attribute 'name'
属性错误:'Cat' 对象没有 'name' 属性

提示

  • 在日常开发中,不推荐在类的外部 给对象增加属性
    • 如果在运行时,没有找到属性,程序会报错
  • 对象应该包含有哪些属性,应该 封装在类的内部

4.2 初始化方法

  • 当使用类名()创建对象时,会自动执行以下操作:
    1. 为对象在内存中 分配空间 —— 创建对象
    2. 为对象的属性 设置初始值 —— 初始化方法(init)
  • 这个 初始化方法 就是 __init__ 方法,__init__ 是对象的内置方法

__init__ 方法是 专门 用来定义一个类 具有哪些属性的方法

Cat 中增加 __init__ 方法,验证该方法在创建对象时会被自动调用

class Cat:
    """这是一个猫类"""

    def __init__(self):
        print("初始化方法")

4.3 在初始化方法内部定义属性

  • __init__ 方法内部使用 self.属性名 = 属性的初始值 就可以 定义属性
  • 定义属性之后,再使用 Cat 类创建的对象,都会拥有该属性
class Cat:

    def __init__(self):

        print("这是一个初始化方法")
        
        # 定义用 Cat 类创建的猫对象都有一个 name 的属性
        self.name = "Tom"

    def eat(self):
        print("%s 爱吃鱼" % self.name)

# 使用类名()创建对象的时候,会自动调用初始化方法 __init__
tom = Cat()

tom.eat()

4.4 改造初始化方法

  • 在开发中,如果希望在创建对象的同时,就设置对象的属性,可以对 __init__方法进行改造
    1. 把希望设置的属性值,定义成 __init__ 方法的参数
    2. 在方法内部使用 self.属性 = 形参 接收外部传递的参数
    3. 在创建对象时,使用 类名(属性1, 属性2...) 调用
class Cat:

    def __init__(self, name):
        print("初始化方法 %s" % name)
        self.name = name
    ...
    
tom = Cat("Tom")

lazy_cat = Cat("大懒猫")

05. 内置方法和属性

序号方法名类型作用
01__del__方法对象被从内存中销毁前,会被 自动 调用
02__str__方法返回对象的描述信息print 函数输出使用

5.1 __del__ 方法

  • Python
    • 当使用 类名() 创建对象时,为对象 分配完空间后,自动 调用 __init__ 方法
    • 当一个 对象被从内存中销毁 前,会 自动 调用 __del__ 方法
  • 应用场景
    • __init__ 改造初始化方法,可以让创建对象更加灵活
    • __del__ 如果希望在对象被销毁前,再做一些事情,可以考虑一下 __del__ 方法
  • 生命周期
    • 一个对象从调用 类名() 创建,生命周期开始
    • 一个对象的 __del__ 方法一旦被调用,生命周期结束
    • 在对象的生命周期内,可以访问对象属性,或者让对象调用方法
class Cat:

    def __init__(self, new_name):

        self.name = new_name

        print("%s 来了" % self.name)

    def __del__(self):

        print("%s 去了" % self.name)

# tom 是一个全局变量
tom = Cat("Tom")
print(tom.name)

# del 关键字可以删除一个对象
del tom
print("-" * 50)

5.2 __str__ 方法

  • Python 中,使用 print 输出 对象变量,默认情况下,会输出这个变量 引用的对象由哪一个类创建的对象,以及 在内存中的地址十六进制表示
  • 如果在开发中,希望使用 print 输出 对象变量 时,能够打印 自定义的内容,就可以利用 __str__ 这个内置方法了

注意:__str__ 方法必须返回一个字符串

class Cat:

    def __init__(self, new_name):

        self.name = new_name

        print("%s 来了" % self.name)

    def __del__(self):

        print("%s 去了" % self.name)

    def __str__(self):
        return "我是小猫:%s" % self.name

tom = Cat("Tom")
print(tom)

06私有属性和私有方法

应用场景

  • 在实际开发中,对象某些属性或方法 可能只希望 在对象的内部被使用,而 不希望在外部被访问到
  • 私有属性 就是 对象 不希望公开的 属性
  • 私有方法 就是 对象 不希望公开的 方法

定义方式

  • 定义属性或方法时,在 属性名或者方法名前 增加 两个下划线,定义的就是 私有 属性或方法
class Women:

    def __init__(self, name):

        self.name = name
        # 不要问女生的年龄
        self.__age = 18

    def __secret(self):
        print("我的年龄是 %d" % self.__age)


xiaofang = Women("小芳")
# 私有属性,外部不能直接访问
# print(xiaofang.__age)

# 私有方法,外部不能直接调用
# xiaofang.__secret()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于 UWB 数字孪生钢厂人员安全定位

钢铁冶炼从原料采购、焦化烧结、炼铁、炼钢、轧钢、到产出成品,其冗长的生产工序、复杂的作业场景,更应加以重视生产现场的人员作业安全,将安全防范监管贯穿日常作业全过程,打通安全生产责任“最后一公里”。 随着近几年钢厂信息…

电源管理芯片|“小方寸”大作为—TMI3191直击智能穿戴电源痛点!

随着移动通信、人工智能等技术的不断发展和融合, 智能终端产业正在加速裂变,智能穿戴迅速成为人们日常生活和工作中的新宠。 根据IDC最新数据显示,2016年~2020年出货量从1.02亿台增长至4.45亿台,预测2020-2025年全球智能可穿戴设备出货量复合…

手写B+树

1.特点 https://blog.csdn.net/weixin_57128596/article/details/127030901?ops_request_misc%257B%2522request%255Fid%2522%253A%2522167176442416800188598723%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id167176442416800…

springboot mybatis大学生校园宿舍管理系统源码含文档

摘 要:宿舍是大学生学习与生活的主要场所之一,宿舍管理是高校学工管理事务中 尤为重要的一项。随着我国高校招生规模的进一步扩大,学生总体人数的不断增加, 宿舍管理工作变得愈加沉重和琐碎,学生宿舍信息的采集、汇总…

Classifier Guided Diffusion

前言 上次已经学习了open AI的 DDPM(DDPM原理与代码剖析)和 IDDPM(IDDPM原理和代码剖析), 以及 斯坦福的 DDIM DDIM原理及代码(Denoising diffusion implicit models). 这次来看openAI的另一个作品 Diffusion Models Beat GANs on Image Synthesis github: https://github.com…

操作系统(4)页面替换策略算法模拟实现

1. 效果展示 2. 程序流程图 (1) 程序总流程 (2) FIFO策略 (3) LRU策略 (4) OPT策略 3. 数据结构设计 //页面数据结构struct PageInfo {int id;int visit;};PageInfo* Block; // 物…

我国电力物流行业发展现存问题及解决策略分析 企业应加强信息化建设

电力物流是电力发、输、配、售流程的一部分,是为了满足终端用户需求,对电力从发电到终端用户的高效率、高效益的流动以及流程各环节相互提供的服务和相关信息在此过程中的正、反向流动所进行的计划、实施与控制过程。 根据观研报告网发布的《中国电力物流…

nginx反向代理ssl配置

nginx反向代理是各大应用环境最重要的环节,今天我们来说说如何配置反代理SSL这书,首先配置准备好:nginx环境、SSL证书、确定需要设置的端口防火墙开放(尤其是云服务器需要单独设置,windows防火墙单独设置)。…

电巢:上海半导体投资浪潮的前奏、高潮与转折

朱旭东是上海半导体投资界的开创性人物,他带领浦科投资投出了中微半导体、盛美半导体等当下的「国之重器」,并控股了万业企业、上工申贝等A股上市公司。随后又在国内率先发起设立并管理了上海半导体装备材料产业投资基金,推动旗下上市公司万业…

前端开发--JavaScript Bom和Dom

JavaScript Bom和Dom这一篇就够啦JavaScript Bom和Dom1、Web API 基本认知2、DOM -- 基础2.1 DOM简介2.2 获取元素2.3 事件基础2.4 操作元素2.5 节点操作2.6 DOM重点核心3、DOM -- 事件高级3.1 注册事件(绑定事件)3.2 删除事件(解绑事件)3.3 DOM事件流3.4 事件对象3.5 事件委托…

如何理解UML2.5.1(05篇)

标记subsets和redefines可以说是UML2.5.1中最重要的一对标记。标记subsets相对要好理解一些,但是redefines的含义就没有那么直白。先看一下目前已知的subsets和redefines的效果: 假定图一中A1和B1的关联两端的标记都是subsets&#xff0…

Torch计算方法

Torch 中的计算方法与 Numpy 的计算方法很类似;Torch中带 “下划线 ” 的操作,都是in-place的。 求和: torch.sum() 对输入的 tensor 数据的某一维度求和; 1.torch.sum(input, dtypeNone) 2&…

硬盘 / 硬盘控制器主要端口寄存器 / Controller Register

文章目录IDE 与 SATA硬盘分区表结构硬盘控制器主要端口寄存器data 寄存器Error && FeaturesErrorFeaturesSector countLBA low | mid | highdevice 寄存器StatusCommandIDE 与 SATA 很久以前,硬盘控制器和硬盘是分开的,后面开发了一个新接口&am…

【观察】新华三:智慧计算“再进化”,算力创新“再升级”

今天,算力就是生产力已成为业界共识,特别是算力作为数字经济时代的关键生产力要素,更成为了挖掘数据要素价值,推动数字经济发展的核心支撑力和驱动力。在此过程中,由算力驱动的数字经济除了以信息产业这一独立的经济形…

Linux进程间通信(二):命名管道的使用和原理

文章目录一、前言二、命名管道的使用一、前言 我们上篇博客里谈到,进程间通信的本质在于如何让两个进程看到同一份资源。匿名管道的核心思想就是让子进程继承父进程,从而让父子进程看到同一份管道文件,但这也使通信仅仅局限在具有血缘关系的进…

比Sqoop功能更加强大开源数据同步工具DataX实战

文章目录概述定义与Sqoop对比框架设计支持插件核心架构核心优势部署基础环境安装从stream读取数据并打印到控制台读取MySQL写入HDFS读取HDFS写入MySQL执行流程概述 定义 DataX 官网地址 https://maxwells-daemon.io/ DataX GitHub源码地址 https://github.com/alibaba/DataX D…

SaaS是什么?企业采购SaaS有什么好处?

简单的来讲讲我们对SaaS的理解吧。过去通常来说,我们采购企业使用的产品,通常有比如传统的软件包下载、按照自己的需求找开发商定制、如果有自研能力的团队可以自己去开发。但是这样就比如带来很多问题: 比如业务规则更新了怎么办&#xff1…

Protobuf 了解

Protocol Buffers 是一种结构数据序列化方法,可以将C中定义的存储类的内容与二进制序列串相互转换,主要用于数据传输或数据存储,可类比XML、JSON,而XML、JSON基于文本格式,protobuf是二进制格式,所以比XML、…

【论文阅读总结】inception v4与Inception-ResNet总结

Inception-v4, Inception-ResNet和Residual connections对学习的影响1.摘要2.引言3.文献综述4.体系结构的选择4.1 Pure Inception4.2 Residual Inception Blocks【残差Inception 块】4.3 Scaling of the Residuals【残差的缩放】4.3.1实验发现4.3.1.1实验发现14.3.1.2实验发现2…

ERP容灾备份维护工作有哪些?服务器容灾备份

ERP维护工作有哪些?这是公司信息化专员工作职责:信息规划  1、参与 公司信息化系统总体构架,建立健全公司信息化各项管理制度和标准业务流程,组织公司各业务部门不断进行业务流程的梳理、优化和创新,推动信息化的持续…