Python笔记08-面向对象

文章目录

  • 类和对象
  • 构造方法
  • 内置方法
  • 封装
  • 继承
  • 类型注解
  • 多态

类只是一种程序内的“设计图纸”,需要基于图纸生产实体(对象),才能正常工作
这种套路,称之为:面向对象编程

类和对象

定义类的语法如下:

class 类名称:  class是关键字,表示要定义类了
      类的属性  类的属性,即定义在类中的变量(成员变量)
      类的行为    类的行为,即定义在类中的函数(成员方法)

创建实例的语法:

对象名= 类名称()   如: user = User()

类中:
不仅可以定义属性用来记录数据
也可以定义函数,用来记录行为
其中:
类中定义的属性(变量),我们称之为:成员变量
类中定义的行为(函数),我们称之为:成员方法

示例:

class Stu:
    name = None
    age = None
    def say_hi(self):
        print(f"Hi大家好,我是{self.name}")

stu = Stu()
stu.name="zhang"
stu.say_hi()

在类中定义成员方法和定义函数基本一致,但仍有细微区别:
可以看到,在方法定义的参数列表中,有一个:self关键字
self关键字是成员方法定义的时候,必须填写的。
它用来表示类对象自身的意思
当我们使用类对象调用方法的是,self会自动被python传入
在方法内部,想要访问类的成员变量,必须使用self
self关键字,尽管在参数列表中,但是传参的时候可以忽略它

构造方法

可以通过 需构造方法:init() 来直接为属性赋值,而不用挨个手工赋值。

class Stu:
    name = None
    age = None
    def say_hi(self):
        print(f"Hi大家好,我是{self.name}")
    def __init__(self,name,age):
        self.name=name
        self.age=age

stu = Stu("zhang",18)
stu.say_hi()

构造方法的名称是:init,注意init前后的2个下划线符号
构造方法的作用:
构建类对象的时候会自动运行
构建类对象的传参会传递给构造方法,借此特性可以给成员变量赋值
注意事项:
构造方法不要忘记self关键字
在方法内使用成员变量需要使用self

内置方法

上文学习的__init__ 构造方法,是Python类内置的方法之一。
这些内置的类方法,各自有各自特殊的功能,这些内置方法我们称之为:魔术方法

str

当类对象需要被转换为字符串之时,会输出如上结果(内存地址)

内存地址没有多大作用,我们可以通过__str__方法,控制类转换为字符串的行为。

class Student:
    def __init__(self,name,age):
        self.name=name
        self.age=age
stu = Student("zhang",18)  #<__main__.Student object at 0x000002400CA789D0>
print(stu)

class Student:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def  __str__(self):
        return f"Student类的对象,name={self.name}age={self.age}"
stu = Student("zhang",18)  #Student类的对象,name=zhangage=18
print(stu)

lt
直接对2个对象进行比较是不可以的,但是在类中实现__lt__方法,即可同时完成:小于符号 和 大于符号 2种比较

class Student:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def  __str__(self):
        return f"Student类的对象,name={self.name};age={self.age}"
    def __lt__(self, other):
        return self.age<other.age

stu = Student("zhang",18)  #Student类的对象,name=zhangage=18
#rint(stu)
stu2 = Student("lisa",19)  
print(stu<stu2)#True

le
魔术方法:__le__可用于:<=、>=两种比较运算符上

class Student:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def  __str__(self):
        return f"Student类的对象,name={self.name};age={self.age}"
    def __lt__(self, other):
        return self.age<other.age
    def __le__(self, other):
        return self.age<=other.age

stu = Student("zhang",18)  #Student类的对象,name=zhangage=18
#rint(stu)
stu2 = Student("lisa",18)
print(stu<=stu2)#true

eq
不实现__eq__方法,对象之间可以比较,但是是比较内存地址,也即是:不同对象==比较一定是False结果。
实现了__eq__方法,就可以按照自己的想法来决定2个对象是否相等了。

class Student:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def  __str__(self):
        return f"Student类的对象,name={self.name};age={self.age}"
    def __lt__(self, other):
        return self.age<other.age
    def __le__(self, other):
        return self.age<=other.age
    def __eq__(self, other):
        return self.name==other.name and self.age == other.age

stu = Student("zhang",18)  #Student类的对象,name=zhangage=18
#rint(stu)
stu2 = Student("zhang",18)
print(stu==stu2)#true
stu2 = Student("zhang",19)
print(stu==stu2)#false

封装

面向对象编程,是许多编程语言都支持的一种编程思想。
简单理解是:基于模板(类)去创建实体(对象),使用对象完成功能开发。
面向对象包含3大主要特性:封装、继承、多态

封装表示的是,将现实世界事物的:属性、行为
封装到类中,描述为:成员变量、成员方法
从而完成程序对现实世界事物的描述

既然现实事物有不公开的属性和行为,那么作为现实事物在程序中映射的类,也应该支持。

类中提供了私有成员的形式来支持 :私有成员变量、私有成员方法
定义私有成员的方式非常简单,只需要:
私有成员变量:变量名以__开头(2个下划线)
私有成员方法:方法名以__开头(2个下划线)
即可完成私有成员的设置

class Student:
    name=None
    age=None
    __money=None
    def __init__(self,name,age,money):
        self.name=name
        self.age=age
        self.__money=money
    def add_money(self,add_money):
        self.__money+=add_money
    
    def __show_money(self ):
        print(self.__money)
    def show_money2(self ):
        print("showmoney2:",self.__money)

stu = Student("zhangsan",19,200)
stu.add_money(100)#只能通过非私有方法去操作私有成员
stu.show_money2() #  300
stu.name="lisa" 
stu.__money=1000 # 不报错无效
stu.show_money2() # 300

继承

继承分为:单继承和多继承
继承表示:将从父类那里继承(复制)来成员变量和成员方法(不含私有),不用再重新定义。

class ClasA (ClassB) # 单继承
class ClasA (ClassB,ClassC,ClassD) #多继承,即一个类,可以继承多个父类

多个父类中,如果有同名的成员,那么默认以继承顺序(从左到右)为优先级。
即:先继承的保留,后继承的被覆盖

子类构建的类对象,可以:
有自己的成员变量和成员方法
使用父类的非私有成员变量和成员方法

pass是占位语句,用来保证函数(方法)或类定义的完整性,表示无内容,空的意思

class LittleStudent(Student):
    littleState=None
    def __init__(self,name,age,lstate):
        self.name=name
        self.age=age
        self.littleState=lstate
lstu=LittleStudent("zhang",10,"little")
lstu.add_money(100)#TypeError: unsupported operand type(s) for +=: 'NoneType' and 'int'
lstu.show_money2()

重写
子类继承父类的成员属性和成员方法后,如果对其“不满意”,那么可以进行复写。
即:在子类中重新定义同名的属性或方法即可。

class Car:
    color="红色"
    length=3.6
    def show_info(self):
        print("汽车信息:color:",self.color,";length:",self.length)
class BMW(Car):
    color="蓝色"
    def show_info(self):
        print("BMW信息:color:",self.color,";length:",self.length)

bmw=BMW()
bmw.show_info()#BMW信息:color: 蓝色 ;length: 3.6

只能在子类内调用父类的同名成员。
子类的类对象直接调用会调用子类复写的成员

一旦复写父类成员,那么类对象调用成员的时候,就会调用复写后的新成员
如果需要使用被复写的父类的成员,需要特殊的调用方式:
调用父类成员
使用成员变量:父类名.成员变量
使用成员方法:父类名.成员方法(self)
使用super()调用父类成员
使用成员变量:super().成员变量
使用成员方法:super().成员方法()

class Car:
    color="红色"
    length=3.6
    def show_info(self):
        print("汽车信息:color:",self.color,";length:",self.length)
class BMW(Car):
    color = "蓝色"
    def show_info(self):
        Car.show_info() #汽车信息:color: 蓝色 ;length: 3.6
        print(super().color)#红色
        print("BMW信息:color:",self.color,";length:",self.length)

bmw=BMW()
bmw.show_info()#BMW信息:color: 红色 ;length: 3.6

类型注解

为什么PyCharm工具能够正确的提示方法的参数类型、方法名称的?
它是如何知道这个对象有append方法?
因为:PyCharm确定这个对象的类型,是list类型
同样,我们换一份代码:
在这里插入图片描述

定义一个函数func,接收一个参数data
PyCharm不会在做出任何提示了

为什么内置模块random的方法可以提示类型
自己定义的就不可以?
在这里插入图片描述

因为PyCharm无法通过代码
确定应传入什么类型

Python在3.5版本的时候引入了类型注解,以方便静态类型检查工具,IDE等第三方工具。
类型注解:在代码中涉及数据交互的地方,提供数据类型的注解(显式的说明)。
主要功能:
帮助第三方IDE工具(如PyCharm)对代码进行类型推断,协助做代码提示
帮助开发者自身对变量进行类型注释
支持:
变量的类型注解
函数(方法)形参列表和返回值的类型注解

变量的类型注解
语法

变量: 类型

元组类型设置类型详细注解,需要将每一个元素都标记出来
字典类型设置类型详细注解,需要2个类型,第一个是key第二个是value

print("="*20)#false
var1:int =10
var2:bool=False
var3:str="123"
stu:Student = Student()
my_list:list=[1,2,3]
my_tuple:tuple=(1,2,3)
my_set:set[int]={2,3,4}#容器类型详细注解
my_tuple2:tuple[int,str,bool]=(1,"123",False) #容器类型详细注解

除了使用 变量: 类型, 这种语法做注解外,也可以在注释中进行类型注解。
语法:# type:类型

var3 =10 # type:int
my_dict={"zhang":18} #type:dict[str,int]

一般,无法直接看出变量类型之时会添加变量的类型注解
var4:Student=func()

类型注解主要功能在于:
帮助第三方IDE工具(如PyCharm)对代码进行类型推断,协助做代码提示
帮助开发者自身对变量进行类型注释(备注)
并不会真正的对类型做验证和判断。
也就是,类型注解仅仅是提示性的,不是决定性的
如下代码,是不会报错的哦。

var1:int ="123123"

函数(方法)形参列表和返回值的类型注解

在编写函数(方法),使用形参data的时候,工具没有任何提示
在调用函数(方法),传入参数的时候,工具无法提示参数类型
这些都是因为,我们在定义函数(方法)的时候,没有给形参进行注解
函数和方法的形参类型注解语法

def test_type(a:int,b:int,c:int,d:int):
    pass
def add(a:int,b:int):
    return a+b    

在这里插入图片描述

同时,函数(方法)的返回值也是可以添加类型注解的。
语法如下

def add(a:int,b:int)->int:
    return a+b
print(add(1,2))

Union类型
使用Union[类型, …, 类型]
可以定义联合类型注解
Union联合类型注解,在变量注解、函数(方法)形参和返回值注解中,均可使用。

在这里插入图片描述
在这里插入图片描述

多态

多态,指的是:多种状态,即完成某个行为时,使用不同的对象会得到不同的状态
多态常作用在继承关系上.比如
函数(方法)形参声明接收父类对象
实际传入父类的子类对象进行工作
即:
以父类做定义声明
以子类做实际工作
用以获得同一行为, 不同状态

这种设计的含义是:
父类用来确定有哪些方法
具体的方法实现,由子类自行决定
这种写法,就叫做抽象类(也可以称之为接口)
抽象类:含有抽象方法的类称之为抽象类
抽象方法:方法体是空实现的(pass)称之为抽象方法

在这里插入图片描述

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

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

相关文章

vue v-for循环拖拽排序,实现数组选中的数据拖拽后对应的子数据也进行重新排序

如下图所有&#xff0c;有个需求更新&#xff0c; 实现拖拽。 1&#xff0c;当新增了测点类型的时候每个对应的回路子数据都会新增对应的测点类型。 2&#xff0c;当拖动测点类型结束的时候对应的回路里面的内容也会跟着测点类型的排序自动排序 其实很简单&#xff0c;只要会了…

el-tree多个树进行节点同步联动(完整版)

2024.1.11今天我学习了如何对多个el-tree树进行相同节点的联动效果&#xff0c;如图&#xff1a; 这边有两棵树&#xff0c;我们发现第一个树和第二个树之间会有重复的指标&#xff0c;当我们选中第一个树的指标&#xff0c;我们希望第二个树如果也有重复的指标也能进行勾选上&…

鸿蒙实战基础(ArkTS)-窗口管理

基于窗口能力&#xff0c;实现验证码登录的场景&#xff0c;主要完成以下功能&#xff1a; 登录页面主窗口实现沉浸式。输入用户名和密码后&#xff0c;拉起验证码校验子窗口。验证码校验成功后&#xff0c;主窗口跳转到应用首页。 登录界面实现沉浸式 完成登录界面布局的编…

全面解析微服务

导读 微服务是企业应用及数据变革升级的利器&#xff0c;也是数字化转型及运营不可或缺的助产工具&#xff0c;企业云原生更离不开微服务&#xff0c;同时云原生的既要最大化发挥微服务的价值&#xff0c;也要最大化弥补微服务的缺陷。本文梳理了微服务基础设施组件、服务网格、…

企业数据中台整体介绍及建设方案:文件全文51页,附下载

关键词&#xff1a;数据中台解决方案&#xff0c;数据治理&#xff0c;数据中台技术架构&#xff0c;数据中台建设内容&#xff0c;数据中台核心价值 一、什么是数据中台&#xff1f; 数据中台是指通过数据技术&#xff0c;对海量数据进行采集、计算、存储、加工&#xff0c;…

富唯智能新研发的复合机器人,轻松破解汽车底盘零配件生产中的难题

随着汽车工业的快速发展&#xff0c;对于底盘零配件的需求也日益增长。为了满足市场需求&#xff0c;智能物流解决方案在汽车底盘零配件生产中扮演着越来越重要的角色。如何实现高效、准确的生产和物流管理&#xff0c;以满足市场快速变化的需求&#xff0c;成为了汽车生产商亟…

在加载第三方库过程中,无法加载到库的问题(使用readelf, patchelf命令)

无法加载到库问题 问题及分析过程readelf 命令patchelf命令 问题及分析过程 在开发一个程序过程中&#xff0c;需要加载第三方库iTapTradeAPI, 在CMakeList.txt中已经设置了CMAKE_INSTALL_RPATH&#xff0c;但是发布到生产之后由于目录问题无法加载到libiTapTradeAPI库了 下面…

Vue过滤器详解

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介基本用法多个过滤器的串联过滤器在指令中的应用全局过滤器 ⭐ 本期推荐 ⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏&#xff01;创建这个专栏的初衷是为了帮助大家更好地应对 Vue.js 技能树的学习。每…

活动回顾∣“全邻友好,艺术大咖交流会”——员村街开展社区微型养老博览会长者文艺汇演活动

为进一步营造邻里守望&#xff0c;共建美好社区的氛围&#xff0c;促进社区长者参与社区服务&#xff0c;展示社区长者健康、积极向上的精神风貌&#xff0c;2024年1月10日&#xff0c;员村街开展“全邻友好&#xff0c;艺术大咖交流会”——微型养老博览会活动&#xff0c;让长…

电影《艾里甫与赛乃姆》简介

电影《艾里甫与赛乃姆》由天山电影制片厂于1981年摄制&#xff0c;该片由傅杰执导&#xff0c;由买买提祖农司马依、布维古丽、阿布里米提沙迪克、努力曼阿不力孜、买买提依不拉音江、阿不都热合曼艾力等主演。 该片改编自维吾尔族民间爱情叙事长诗《艾里甫与赛乃姆》&#xf…

ModuleNotFoundError: No module named ‘simple_knn‘

【报错】使用 AutoDL 复现 GaussianEditor 时引用 3D Gaussian Splatting 调用simple_knn 时遇到 ModuleNotFoundError: No module named ‘simple_knn‘ 报错&#xff1a; 【原因】 一开始以为是版本问题&#xff0c;于是将所有可能的版本都尝试了 (from versions: 0.1, 0.2…

一套成熟的Spring Cloud智慧工地平台源码,自主版权,支持二次开发!

智慧工地源码&#xff0c;java语言开发的智慧工地源码 智慧工地利用移动互联、物联网、云计算、大数据等新一代信息技术&#xff0c;彻底改变传统施工现场各参建方的交互方式、工作方式和管理模式&#xff0c;为建设集团、施工企业、监理单位、设计单位、政府监管部门等提供一揽…

Android开发基础(三)

Android开发基础&#xff08;三&#xff09; 本篇将介绍Android权限管理。 Android权限管理 Android权限管理主要是为了保护用户的隐私和设备的安全性&#xff1b; 在Android系统中&#xff0c;应用在请求权限时必须进行明确的申请&#xff0c;根据权限的保护级别&#xff0…

NAND Separate Command Address (SCA) 接口数据传输解读

在采用Separate Command Address (SCA) 接口的存储产品中&#xff0c;DQ input burst和DQ output burst又是什么样的策略呢&#xff1f; DQ Input Burst: 在读取操作期间&#xff0c;数据以一种快速并行的方式通过DQ总线传送到控制器。在SCA接口下&#xff0c;虽然命令和地址信…

预约上门按摩系统开发会涉及哪些关键技术

一套完善的预约上门按摩系统的开发是需要考虑很多方面&#xff0c;无论是从用户下单还是技师、订单、财务以及各个方面的管理&#xff0c;涉及的逻辑和技术非常多&#xff0c;今天就以最简单的方式把预约上门按摩系统的技术方面分享一下。 1.移动端应用程序开发技术&#xff1a…

腾讯云COS桶文件上传下载工具类

1&#xff0c;申请key和密钥 2&#xff0c;引入依赖 <dependency><groupId>com.qcloud</groupId><artifactId>cos_api</artifactId><version>5.6.24</version></dependency>3&#xff0c;工具类 package com.example.activi…

Docker基础命令

Docker常用命令 docker run docker run [OPTIONS] IMAGE [COMMAND] [ARG...] -e设置环境变量&#xff1b;-e usernameyjy --name为容器指定一个名称&#xff1b;--nameyjy -p指定端口映射&#xff0c;格式为&#xff1a;主机(宿主)端口:容器端口 -p 80:8080 -t为容器重新分…

WARNING: IPv4 forwarding is disabled. Networking will not work.

今天用docker部署容器&#xff0c;发现一个问题&#xff0c;docker-compose up启动成功&#xff0c;但无法正常访问接口。 查找问题步骤&#xff1a; 1、直接在服务器运行jar包&#xff0c;发现可以正常启动&#xff0c;也能正常访问接口&#xff0c;排除jar包本身问题以及防…

用C#实现简单的线性回归

前言 最近注意到了NumSharp&#xff0c;想学习一下&#xff0c;最好的学习方式就是去实践&#xff0c;因此从github上找了一个用python实现的简单线性回归代码&#xff0c;然后基于NumSharp用C#进行了改写。 NumSharp简介 NumSharp&#xff08;NumPy for C#&#xff09;是一个在…

STM32F103RCT6开发板M3单片机教程07-TIMER1CH1输出 PWM做LED呼吸灯

概述 本教程使用是&#xff08;光明谷SUN_STM32mini开发板&#xff09; 免费开发板 在谷动谷力社区注册用户&#xff0c;打卡&#xff0c;发帖求助都可以获取积分&#xff0c;当然最主要是发原创应用文档奖励更多积分&#xff0e; (可用积分换取&#xff0c;真的不用钱&…