python学习之路 - 面向对象编程

news2024/12/28 12:38:31

目录

  • 一、面向对象编程
    • 1、成员方法
        • a、类的定义和使用
        • b、案例
    • 2、类和对象
    • 3、构造方法
    • 4、其他内置方法(魔术方法)
    • 5、面向对象三大特性——封装
        • a、介绍:
        • b、表现形式:私有成员变量与私有成员方法
        • c、作用
    • 6、面向对象三大特性——继承
        • a、介绍
        • b、语法
        • c、分类
        • d、pass关键词
        • e、复写
    • 7、类型注解
        • a、介绍
        • b、变量的类型注解
        • c、函数(方法)的类型注解
        • c、Union类型
    • 8、面向对象三大特性——多态
        • a、介绍
        • b、普通示例
        • c、抽象类示例

一、面向对象编程

1、成员方法

a、类的定义和使用

定义在类外面的函数称为函数,定义在类内部的函数称为方法

#类的定义语法
class 类名称:
	类的属性名: 属性值					#这里就是成员变量
	def 方法名(self,形参1,形参2...):		#这里就是成员方法,当外部调用此方法时,self参数可忽略不传
		方法体

#创建类的语法
对象 = 类名称()
b、案例

案例:创建一个人的类,编辑人的信息并调用方法输出信息

class people:
    name: None      #人名
    age: None       #年龄
    sex: None       #性别

    def introduce(self):
        print("我叫%s,今年%d岁,性别%s" % (self.name, self.age, self.sex))

p1 = people()
p1.name = "张三"
p1.age = 18
p1.sex = "男"

print(p1.name)
print(p1.age)
print(p1.sex)
p1.introduce()

结果为:
张三
18
男
我叫张三,今年18岁,性别男

2、类和对象

  • 类是指创建出一个模板,提供给具体的个人使用
  • 对象是基于模板的基础上创建一个具体实例,修改对象的属性不会更改类本身的内容,并且多个对象之间的数据值不会影响
  • 面向对象编程就是使用类创建对象,并且使用对象来完成具体的工作

3、构造方法

  • python类可以使用__init__()方法,称之为构造方法
  • 注意:构造方法前后各有两个下划线
  • 在创建类对象时,构造方法会自动执行,可以将参数自动传递给构造方法给对象赋值
  • 当有构造方法时,类中定义字段可省略
class people:
    name: None   #人名			此可省略
    age: None    #年龄			此可省略
    sex: None    #性别			此可省略

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

    def introduce(self):
        print("我叫%s,今年%d岁,性别%s" % (self.name, self.age, self.sex))

p1 = people("张三", 18, "男")
p1.introduce()

结果为:
我叫张三,今年18岁,性别男

4、其他内置方法(魔术方法)

  • __str__:字符串方法
    • 当类中未定义此方法时,输出类时输出的内容为内存地址
    • 当类中定义了此方法时,输出类时输出的是str方法中的内容
#当类中未定义此方法时,输出类为内存地址
class Student:
    name = None
    age = None
    address = None

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

student = Student("张三", 18, "北京")
print(student)
print(str(student))

结果为:
<__main__.Student object at 0x0000025921C64310>
<__main__.Student object at 0x0000025921C64310>
#当类中定义了此方法时,输出类时输出的是str方法中的内容
class Student:
    name = None
    age = None
    address = None

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

    def __str__(self):
        return f"我叫{self.name},今年{self.age}岁,地址{self.address}"

student = Student("张三", 18, "北京")
print(student)
print(str(student))

结果为:
我叫张三,今年18岁,地址北京
我叫张三,今年18岁,地址北京
  • __lt__:小于大于符号比较
    • 当类中未定义此方法, 两个对象比较会报错
    • 当类中定义了此方法,会根据此方法中定义的内容比较大小
#当类中未定义此方法, 两个对象比较会报错
class Student:
    name = None
    age = None
    address = None

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

student = Student("张三", 18, "北京")
student1 = Student("李四", 19, "上海")

print(student < student1)

报错信息:
Traceback (most recent call last):
  File "F:\Pycharm\workspaces\test\main.py", line 761, in <module>
    print(student < student1)
          ^^^^^^^^^^^^^^^^^^
TypeError: '<' not supported between instances of 'Student' and 'Student'
#当类中定义了此方法,会根据此方法中定义的内容比较大小
class Student:
    name = None
    age = None
    address = None

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

    def __lt__(self, other):
        return self.age < other.age     #定义根据年龄来比较

student = Student("张三", 18, "北京")
student1 = Student("李四", 19, "上海")

print(student < student1)

结果为:
True
  • __le__:小于等于、大于等于符号比较
    • 当类中未定义此方法, 两个对象比较会报错
    • 当类中定义了此方法,会根据此方法中定义的内容比较大小
# 当类中未定义此方法, 两个对象比较会报错
class Student:
    name = None
    age = None
    address = None

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

student = Student("张三", 18, "北京")
student1 = Student("李四", 19, "上海")

print(student <= student1)

报错信息为:
Traceback (most recent call last):
  File "F:\Pycharm\workspaces\test\main.py", line 764, in <module>
    print(student <= student1)
          ^^^^^^^^^^^^^^^^^^^
TypeError: '<=' not supported between instances of 'Student' and 'Student'
#当类中定义了此方法,会根据此方法中定义的内容比较大小
class Student:
    name = None
    age = None
    address = None

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

    def __le__(self, other):
        return self.age < other.age     #定义根据年龄来比较

student = Student("张三", 18, "北京")
student1 = Student("李四", 19, "上海")

print(student <= student1)

结果为:
True
  • __eq__:==符号比较
    • 当未定义此方法时,会比较两个对象的内存地址是否一致
    • 当定义了此方法时,会根据方法中定义的内容进行比较
#当未定义此方法时,会比较两个对象的内存地址是否一致
class Student:
    name = None
    age = None
    address = None

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

student = Student("张三", 18, "北京")
student1 = Student("张三", 18, "北京")

print(student == student)	
print(student == student1)		#尽管赋值一样,对象不同内存地址也不同

结果为:
True
False
#当定义了此方法时,会根据方法中定义的内容进行比较
class Student:
    name = None
    age = None
    address = None

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

    def __eq__(self, other):
        return self.age == other.age        #根据对象年龄来比较

student = Student("张三", 18, "北京")
student1 = Student("李四", 18, "上海")

print(student == student)
print(student == student1)

结果为:
True
True

5、面向对象三大特性——封装

a、介绍:

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

b、表现形式:私有成员变量与私有成员方法
  • 在类中,只提供给内部使用的变量叫做私有成员变量,只提供给内部使用的方法叫做私有成员方法。封装最主要的表现形式就是私有成员变量和私有成员方法,其封装特性只能被内部调用,外部无法调用成功
  • 私有成员变量和方法,定义方式为在前面加上两个下划线即可
class Student:
    name = None
    age = None
    address = None
    __sex = None            #私有成员变量

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

    def __introduce(self):      #私有成员方法
        print(f"我叫{self.name},今年{self.age}岁,地址{self.address}")

student = Student("张三", 18, "北京")
student.__sex = '男' 			#此不会报错,但是赋值无效
student.introduce()

错误信息为:
Traceback (most recent call last):
  File "F:\Pycharm\workspaces\test\main.py", line 763, in <module>
    student.introduce()
    ^^^^^^^^^^^^^^^^^
AttributeError: 'Student' object has no attribute 'introduce'
c、作用

私有成员变量和方法能在类中提供仅供内部使用的属性和方法,而不对外开放,保护内部数据

6、面向对象三大特性——继承

a、介绍

如果新的类A中部分信息与现存的另一个类B中的内容一样,则可以类A直接继承类B,这部分重复信息就无需重复定义了

b、语法
class 子类名(父类1,父类2,父类3...):
	类内容体
c、分类
  • 单继承:只继承一个父类的叫单继承
#ClassA继承ClassB
class ClassB:
    name = None
    age = None

class ClassA(ClassB):			#类A继承类B,自动拥有类B中的全部内容
    sex = None

    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex
    def introduce(self):
        print(f"我叫{self.name},今年{self.age}岁,性别{self.sex}")
    
c = ClassA("张三", 18, "男")
c.introduce()

结果为:
我叫张三,今年18岁,性别男
  • 多继承:同时继承多个父类的叫多继承
#ClassA同时继承ClassBClassC
class ClassB:
    name = None
    age = None

class ClassC:
    address = None


class ClassA(ClassB,ClassC):
    name = None
    age = None
    address = None
    sex = None

    def __init__(self, name, age, address, sex):
        self.name = name
        self.age = age
        self.address = address
        self.sex = sex
    def introduce(self):
        print(f"我叫{self.name},今年{self.age}岁,地址{self.address},性别{self.sex}")

c = ClassA("张三", 18, "北京", "男")
c.introduce()

结果为:
我叫张三,今年18岁,地址北京,性别男

但是当多继承时多个父类中存在同名属性或者方法,按父类继承的顺序从左到右,优先使用左边的属性或者方法。左边优先级更高

#ClassA继承ClassBClassC,同时ClassBClassC中有同名属性age
class ClassB:
    name = "张三"
    age = 18

class ClassC():
    address = "北京"
    age = 20


class ClassA(ClassB,ClassC):
    pass

c = ClassA()				
print(f"年龄:{c.age}")		#继承时ClassBClassC左边,则会展示ClassB中的结果

结果为:
年龄:18
d、pass关键词

当某个子类同时继承多个父类,并且子类无需定义其他内容时,可以使用pass关键词

#ClassA同时继承ClassBClassC
class ClassB:
    name = "张三"
    age = 18

class ClassC():
    address = "北京"

class ClassA(ClassB,ClassC):
    pass						#类中无需定义其他内容时用pass关键字

c = ClassA()
print(f"姓名:{c.name},年龄:{c.age},地址:{c.address}")

结果为:
姓名:张三,年龄:18,地址:北京
e、复写
  • 普通复写
    子类继承父类的成员属性和成员方法后,如果对其不满意,则可以进行复写,即在子类中重新定义同名的属性和方法即可
#子类ClassA复写父类ClassB的属性和方法
class ClassB:
    name = "我是ClassB的成员属性"

    def introduce(self):
        print(f"这是ClassB的成员方法,属性内容为:{self.name}")

class ClassA(ClassB):
    name = "我是ClassA的成员属性"

    def introduce(self):
        print(f"这是ClassA的成员方法,属性内容为:{self.name}")

c = ClassA()
c.introduce()		#这里输出的是子类中复写后的结果

结果为:
这是ClassA的成员方法,属性内容为:我是ClassA的成员属性
  • 调用父类内容
    当子类对父类进行复写后,还想要获取父类中原先的成员变量和方法,有两种方式
class ClassB:
    name = "我是ClassB的成员属性"

    def introduce(self):
        print(f"这是ClassB的成员方法,属性内容为:{self.name}")

class ClassA(ClassB):
    name = "我是ClassA的成员属性"

    def introduce(self):		
    	#方式1:调用父类成员
    	#直接使用父类名.属性或者父类名.方法就可以获得父类的信息
        print(f"父类的成员变量为{ClassB.name},父类的成员方法为{ClassB.introduce(self)}")
        
        #方式2:使用super()调用父类成员
        print(f"父类的成员变量为{super().name},父类的成员方法为{super().introduce()}")

c = ClassA()
c.introduce()

结果为:
这是ClassB的成员方法,属性内容为:我是ClassA的成员属性
父类的成员变量为我是ClassB的成员属性,父类的成员方法为None
这是ClassB的成员方法,属性内容为:我是ClassA的成员属性
父类的成员变量为我是ClassB的成员属性,父类的成员方法为None

7、类型注解

a、介绍
  • Python在3.5版本之后引入了类型注解,以方便静态类型检查工具。
  • 类型注解是对变量或者方法中的形参和返回值进行类型标注,方便程序员调用时使用正确的类型数据
  • 方法调用时鼠标停留在调用的地方可以显示类型注解的内容
  • 类型注解只是提示性的,非决定性的。如果定义的类型注解和实际类型不一致,也不会报错

在这里插入图片描述

b、变量的类型注解
  • 语法1:
    变量:类型
#基础数据类型注解
var_1: int = 10
var_2: float = 3.1415
var_3: bool = True
var_4: str = 'test'

#基础容器类型注解
my_list: list = [1,2,3]
my_tuple: tuple = (1,2,3)
my_set: set = {1,2,3}
my_dict: dict = {"age": 18}
my_str: str = "test"

#容器类型详细注解
my_list: list[int] = [1,2,3]
my_tuple: tuple[str,int,bool] = ("test",18,True)		#元组类型设置详细注解需要将每个元素类型都标注出来
my_set: set[int] = {1,2,3}
my_dict: dict[str,int] = {"age": 18}		#字典类型设置详细注解需要标注key和value的类型

#调用函数方法类型的注解
class Student:
	pass
stu: Student = Student()
  • 语法2
    #type:类型
#对基础数据类型注解
var_1 = random.randint(1,10)	#type: int
var_2 = json.loads(data)		#type: dict[str, int]
var_3 = func()					#type: Student
c、函数(方法)的类型注解
  • 形参注解
#语法:
def 函数方法名(形参名:类型,形参名:类型,....)
	函数内容体

#案例,定义add函数传入两个int类型数字
def add(x:int,y:int):
    return x + y
  • 返回值注解
#语法:
def 函数方法名(形参名:类型,形参名:类型,....) -> 返回值类型
	函数内容体

#案例,定义add函数传入两个int类型数字,返回int类型结果
def add(x:int,y:int) -> int:
    return x + y
c、Union类型
  • 语法:
    Union[类型1,类型2,类型3…]

  • 案例

#对变量进行类型注解
from typing import Union

my_list:list[Union[str,int]] = ['1', 2, 3]
my_dict:dict[str,Union[str,int]] = {"name":"张三", "age": 18}

#对函数(方法)进行类型注解
def add(x:Union[str,int],y:Union[str,int]) -> Union[str,int]:
    return x + y

在这里插入图片描述

8、面向对象三大特性——多态

a、介绍

多态指多种状态,完成某个行为时,使用不同的对象会得到不同的状态

b、普通示例
class Dog:
    def speak(self):
        print("汪汪汪")

class Cat:
    def speak(self):
        print("喵喵喵")

def make_sound(animal):
    animal.speak()

dog = Dog()
cat = Cat()
make_sound(dog)
make_sound(cat)

结果为:
汪汪汪
喵喵喵
c、抽象类示例
  • 使用多态的属性,可以直接在父类中定义有那些方法,方法体为pass, 在子类中具体实现
  • 方法体是pass的称为抽象方法,含有抽象方法的类叫做抽象类
class Animal:               #此为抽象类
    def speak(self):        #此为抽象方法
        pass

class Dog(Animal):
    def speak(self):
        print("汪汪汪")

class Cat(Animal):
    def speak(self):
        print("喵喵喵")

def make_sound(animal):
    animal.speak()

结果为:
汪汪汪
喵喵喵

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

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

相关文章

iview Cascader 组件动态数据回显

在使用Cascader组件动态加载数据后&#xff0c;编辑的时候回显会有问题 问题如下&#xff1a;回显的时候&#xff0c;如果是多级&#xff0c;只显示了一级且&#xff0c;中间会闪一下 经过多方查找资料发现&#xff0c;是callback造成的。给组件增加on-visible-change事件监听…

如何下载淘宝的主图视频

目录&#xff1a; 1、通过插件插件下载短视频 1&#xff09;获取“Microsoft Edge扩展” 2&#xff09;搜索“aix智能下载器” 3&#xff09;将插件钉在浏览器上 4&#xff09;嗅控并下载视频 2、从其他来源安装插件 1、通过插件插件下载短视频 1&#xff09;获取“M…

孙宇晨:以区块链科技为翼,青年企业家引领社会进步新航向

​ 孙宇晨&#xff0c;作为区块链领域的一位青年企业家&#xff0c;以其大胆的创新精神和卓越的远见&#xff0c;正在用区块链技术推动社会的进步。他不仅在加密货币和区块链技术领域取得了令人瞩目的成就&#xff0c;还通过不断的努力&#xff0c;致力于将这些技术应用…

FreeRTOS 列表 List 源码解析

目录 一、链表及链表项的定义1、链表节点数据结构 xList_ITEM2、链表精简节点结构 xMINI_LIST_ITEM3、链表根节点结构 xLIST 二、链表的相关操作1、初始化1.1 链表节点初始化1.2 链表根节点初始化 2、插入2.1 将节点插入到链表的尾部2.2 将节点按照升序排列插入到链表 3、删除4…

(go)线性表的顺序存储

闲来无事&#xff0c;更新一下&#xff0c;线性表的顺序存储&#xff0c;go语言版本&#xff0c;效果都已经测试过&#xff0c;下面给出各部分细节 文章目录 1、生成一个线性表2、查找3、插入4、求长度5、改值6、删除7、遍历8、测试程序9、完整代码总结 package mainimport &q…

VBA技术资料MF195:屏蔽工作表中的粘贴输入

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

关于测试工程师在性能测试工具jmeter的熟悉和精通

经过一周的jmeter接口编写&#xff0c;不不不&#xff0c;是一年1-2次的jmeterd 使用&#xff0c;每次都是新的发现&#xff0c;新的起点&#xff01;&#xff01; 去年10月学习过的东西&#xff0c;现在还是不记得当时怎么这么聪明&#xff0c;于是&#xff0c;每次都是0基础…

笔试训练,牛客.合唱团牛客.kannan与高音牛客.拜访(BFS)牛客.买卖股票的最好时机(四)

目录 牛客.合唱团 牛客.kannan与高音 牛客.拜访&#xff08;BFS&#xff09; 牛客.买卖股票的最好时机(四) 牛客.合唱团 dp[i][j]:从1到i,中挑选最大乘积是多少&#xff0c;但是我们会发现状态转移方程推不出来&#xff0c;我们不知道如何推导的任意两个人&#xff0c; 从[…

[解决]Invalid configuration `aarch64-openwrt-linux‘: machine `aarch64-openwrt

背景 交叉编译libev-4.19 问题 checking host system type… Invalid configuration aarch64-openwrt-linux: machine aarch64-openwrt’ not recognized 解决 打开config.sub&#xff0c;在244行后添加"| aarch64-openwrt \ "

RK 方案u-boot阶段添加驱动

驱动部分&#xff1a; u-boot/drivers/video/drm/gpio_init.c /** (C) Copyright 2008-2017 Fuzhou Rockchip Electronics Co., Ltd** SPDX-License-Identifier: GPL-2.0*/#include <config.h> #include <common.h> #include <errno.h> #include <malloc…

jmeter连接mysql数据,并将查询结果存储到指定txt文件中

1、首先jmeter先进行连接mysql相关的配置&#xff0c;我之前已经有教程了就不赘述了&#xff0c;教程链接如下 jmeter连接mysql数据库以及常规用法-CSDN博客 2、当jmeter成功配置mysql数据库后&#xff0c;在JDBC Request组件中进行如下配置 Variable Name of Pool declared…

关于springboot对接通义千问大模型的尝试

今天正在路上刷手机&#xff0c;突然看到群里有人发了一个链接&#xff0c;内容是Spring Cloud Alibaba AI 的使用&#xff0c;spring cloud AI的使用&#xff0c;于是就想着玩一玩试试&#xff0c;难度不大&#xff0c;就是有些文档的坑&#xff0c;这里做一个记录&#xff0c…

基于RK3588+MCU智能清洁车应用解决方案

智能清洁车应用解决方案 在智慧城市建设发展的过程中&#xff0c;智慧环卫是打造智慧城市的重要组成部分&#xff0c;智能清洁车作为实现环卫智能化、提升作业效率和服务质量的关键工具&#xff0c;发挥着不可或缺的作用。 智能清洁车集成了激光雷达、双目视觉、多重传感器以及…

九月更新|用这5个简单技巧,新手在国内也能轻松使用ChatGPT,GPT新手使用手册(学术教师)

一、 ChatGPT可以做什么&#xff1f; 简单来说&#xff0c;ChatGPT就像一个超级智能的聊天机器人&#xff0c;它可以做很多事情。你可以把它想象成一个非常聪明的助手&#xff0c;随时随地帮你解答问题、提供建议、写文章、甚至讲笑话。以下是几个具体的例子&#xff1a; 1. …

论文浅尝 | 超越实体对齐: 通过实体关系协同实现完整的知识图谱对齐

笔记整理&#xff1a;米尔扎提阿力木&#xff0c;天津大学硕士&#xff0c;研究方向为大模型 论文链接&#xff1a;https://arxiv.org/abs/2407.17745 摘要 知识图谱对齐(Knowledge Graph Alignment, KGA)旨在整合来自多个来源的知识&#xff0c;以解决单个知识图谱在覆盖范围和…

一文带你了解可观测领域中APM与eBPF的技术差异

近年来&#xff0c;随着eBPF技术的兴起&#xff0c;很多人有这样的疑惑&#xff1a;eBPF和APM有什么区别&#xff1f;他们是竞争关系还是合作关系&#xff1f;本文将就此展开讨论&#xff0c;并给出切实有效的落地方案。 01APM APM全称&#xff1a;Application Performance Ma…

vulhub xxe靶机

步骤一&#xff0c;访问浏览器 步骤二&#xff0c;输入/robots.txt 步骤三&#xff0c;发现存在用户登录的一个界面/xxe 我们登录进去 步骤四&#xff0c;随便输入一个数字或者字母打开BP 抓到包之后发送的重放器里边 通过抓包发现是XML数据提交 步骤五&#xff0c;通过php…

【采集软件】抖音根据关键词批量采集搜索结果工具

这是我用Python开发的抖音关键词搜索采集工具软件。 软件界面截图&#xff1a; 爬取结果截图&#xff1a; 软件演示视频&#xff1a; https://www.bilibili.com/video/BV1Fc41147Be 完整讲解文章&#xff1a; https://www.bilibili.com/read/cv33750458

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(九)imu运动学;lambda表达式;bind;function;std::move()

一、IMU运动学 1、测量值&#xff1a; 常用六轴IMU是由陀螺仪&#xff08;Gyroscope&#xff09;和加速度计&#xff08;Acclerator&#xff09;两部分组成。 陀螺仪测量&#xff1a;角速度。加速度计&#xff1a;加速度。 安装要尽量保证IMU的安装位置在车辆中心。避免由I…

基于SOA-BP海鸥优化BP神经网络实现数据预测Python实现

BP神经网络是一种多层前馈神经网络&#xff0c;它通过反向传播算法来训练网络中的权重和偏置&#xff0c;以最小化预测误差。然而&#xff0c;BP神经网络的性能很大程度上依赖于其初始参数的选择&#xff0c;这可能导致训练过程陷入局部最优解。海鸥优化算法因其探索和开发能力…