Python进阶编程 --- 1.类和对象

文章目录

    • 第一章:
      • 1.初始对象
        • 1.1 使用对象组织数据
        • 1.2 类的成员方法
          • 1.2.1 类的定义和使用
          • 1.2.2 创建类对象
          • 1.2.3 成员变量和成员方法
          • 1.2.4 成员方法的定义语法
          • 1.2.5 注意事项
        • 1.3 类和对象
          • 1.3.1 基于类创建对象
        • 1.4 构造方法
        • 1.5 其他内置方法
          • 1.5.1 魔术方法
            • str字符串方法
            • lt小于符号比较方法
            • le小于等于、大于等于符号比较方法
            • eq比较运算符方法
        • 1.6 封装
          • 1.6.1 私有成员
            • 定义私有成员:
            • 使用私有成员:
        • 1.7 继承
          • 1.7.1 单继承
          • 1.7.2 多继承
          • 1.7.3 复写
          • 1.7.4 调用父类同名成员
        • 1.8 类型注解
          • 1.8.1 变量的类型注解
            • 类型注解的限制
          • 1.8.2 函数的类型注解
            • 形参注释
            • 返回值注释
          • 1.8.3 Union类型
        • 1.9 多态
          • 1.9.1 抽象类

第一章:

1.初始对象

概念:对象是类(相当模板)的实例,是程序的基本单元,要创建一个新的对象,首先必须定义一个类,用以指明该类型的对象所包含的内容(属性和方法)。

1.1 使用对象组织数据

步骤:

  1. 设计类(class)

  2. 创建对象

  3. 对象属性赋值

# 设计类
class Student:
    name =  None
    age = None

# 创建类对象
s1 = Student()

# 为学生1对象属性赋值
s1.name = "小明"
s1.age = 18 
1.2 类的成员方法
1.2.1 类的定义和使用

语法

class 类名称:
    类的属性

    类的行为
  • class:关键字,表示要定义类

  • 类的属性:定义在类中的变量(成员变量)

  • 类的行为:定义在类中的函数(成员方法)

1.2.2 创建类对象

语法:对象 = 类名称()

1.2.3 成员变量和成员方法
class Student:
    name = None
    age = None
    def print_Info(self):
        print(f"我的名字{self.name},年龄{self.age}")
stu_1 = Student()
stu_1.name = "小明"
stu_1.age = 18
stu_1.print_Info()
  • 类中不仅可定义属性用来记录数据

  • 类中还可定义函数,用来记录行为

  • 类中定义的属性(变量),称为成员变量

  • 类中定义的行为(函数),称为成员方法

1.2.4 成员方法的定义语法

语法

def 方法名(self, 形参1,....., 形参N):
     方法体

self关键字是成员方法定义时,必须填写的。

  • 用来表示类对象自身

  • 使用类对象调用方法,self会自动被python传入

  • 在方法内部中,想要去访问类的成员变量,必须使用self

1.2.5 注意事项
class Student:
    name  = None
    age = None
    def print_info(self):
        print(f"我叫{self.name}")
    def print2_info(self, msg):
        print(f"我的年龄是{msg}")
stu = Student()
stu.name = "小明"
stu.print_info()    # 调用时无需传参
stu.print2_info(18) # 调用时需要传msg参数

self关键字,就算是在参数列表中,但传参时可忽略。

1.3 类和对象
1.3.1 基于类创建对象

语法:对象名 = 类名称()

class Clock:
    id = None     # 闹钟编号
    price = None  # 闹钟价格
    def ring(self): # 闹钟响铃
        import winsound
        winsound.Beep(1000, 3000) # (频率, 时间)
clock1 = Clock()
clock1.id = "000001"
clock1.price = 12.9
print(f"闹钟编号{clock1.id}, 价格为{clock1.price}")
clock1.ring()

clock2 = Clock()
clock2.id = "000002"
clock2.price = 15.9
print(f"闹钟编号{clock2.id}, 价格为{clock2.price}")
clock2.ring()

clock3 = Clock()
clock3.id = "000003"
clock3.price = 18.9
print(f"闹钟编号{clock3.id}, 价格为{clock3.price}")
clock3.ring()
1.4 构造方法
__init__(),称为构造方法。
  • 创建类对象的时候,会自动执行。

  • 创建类对象的时候,将传入参数自动传递给构造方法(init)使用。

class Student:
    name = None
    age = None
    def __init__(self, name, age):
        self.age = age
        self.name = name
        print("Student创建了一个对象")
stu = Student("小明",18)
print(stu.name)
print(stu.age)

在这里插入图片描述

1.5 其他内置方法
1.5.1 魔术方法

常见

__init__ 构造方法
__str__  字符串方法
__lt__   小于、大于符号比较
__le__   小于等于、大于等于符号比较
__eq__   ==符号比较
str字符串方法

作用:控制类转换为字符串。

使用前

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age
stu = Student("小明", 18)
print(stu)
print(str(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("小明", 18)
print(stu)
print(str(stu))

在这里插入图片描述

lt小于符号比较方法
class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __lt__(self, other):
       return self.age < other.age

s1 = Student("小明", 20) # False
s2 = Student("小红", 18) # True
print(s1 < s2)
print(s1 > s2)
le小于等于、大于等于符号比较方法
class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __le__(self, other):
       return self.age <= other.age

s1 = Student("小明", 20) # False
s2 = Student("小红", 18) # True
s3 = Student("小王", 18) # True

print(s1 <= s2)
print(s1 >= s2)
print(s2 >= s3)
eq比较运算符方法
class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __eq__(self, other):
       return self.age == other.age

s1 = Student("小明", 18)
s2 = Student("小红", 18)

print(s1 == s2) # True
1.6 封装

面向对象编程,是很多编程语言都支持的一种编程思想,基于模板去创建实体,使用对象去完成功能的开发。

面向对象包含的3大主要特征

  • 封装

  • 继承

  • 多态

封装的描述

  • 成员变量(属性)

  • 成员方法(行为)

1.6.1 私有成员

作用:在类中提供仅供内部使用的属性和方法,而不对外开放。

定义私有成员:
  • 私有成员变量:变量名以__开头(2个下划线)

  • 私有成员方法:方法名以__开头(2个下划线)

class Student:
    name = None
    age =  None
    __id = None  # 私有成员变量

    def __stu_info(self):
        print("-----------") # 私有成员方法
使用私有成员:

私有对象无法直接被类对象所使用

class Student:
    name = None
    age =  None
    __id = None  # 私有成员变量

    def __stu_info(self):
        print("-----------") # 私有成员方法

stu = Student()  # 创建对象
stu.__stu_info() # 使用私有方法

在这里插入图片描述

私有变量无法赋值,也无法获取值

class Student:
    name = None
    age =  None
    __id__stu = None  # 私有成员变量

    def __stu_info(self):
        print("-----------") # 私有成员方法

stu = Student()  # 创建对象
stu.__id__stu = 20    # 私有变量赋值  不报错,但无效
print(stu.__id__stu)  # 获取私有变量值 报错,无法使用
1.7 继承

作用:从父类继承来成员变量和成员方法(不包含私有)

语法:class 类名(父类名):

               类内容体

继承分为单继承多继承

1.7.1 单继承
class Phone:
    cpu = 'A13'
    screen = 'LG'

    def call_by_4g(self):
        print("4G通话")

class newPhone(Phone):
    battery = None

    def call_by_5g(self):
        print("5G通话")

Phone = newPhone()
print(Phone.cpu)
print(Phone.screen)
Phone.call_by_4g()
Phone.call_by_5g()
1.7.2 多继承

语法:class 类名(父类1,父类2,…父类N):

             类内容体
class Phone:
    producer = 'iP'
    cpu = 'A13'

    def call_by_5g(self):
        print("5G通话")

class NFCReader:
    nfs_type = "第六代"
    producer = "iP"

    def read_card(self):
        print("读卡")
    def write_card(self):
        print("写卡")

class RemoteControl:
    rc_type = "红外遥控"

    def control(self):
        print("开启红外遥控")

class MyPhone(Phone, NFCReader, RemoteControl):
    pass

Phone = MyPhone()
print(Phone.producer)
print(Phone.cpu)
print(Phone.rc_type)
print(Phone.nfs_type)
Phone.call_by_5g()
Phone.read_card()
Phone.write_card()
Phone.control()
1.7.3 复写

子类继承父类的成员属性和成员方法后,如果对其不满意,可进行复写。

在子类中重新定义同名的属性即可。

class Phone:
    producer = "iP"
    cpu = "A13"

    def call_by_5g(self):
        print("父类 - 5G通话")

class newPhone(Phone):
    cpu = "A14"

    def call_by_5g(self):
        print("子类 - 5G通话")

phone = newPhone()
print(phone.cpu) # A14
print(phone.producer) # iP
phone.call_by_5g() # 子类 - 5G通话
1.7.4 调用父类同名成员

复写父类成员后,类对象在调用成员时,会调用复写后的新成员

如果还需要使用被复写的父类中的成员,需要特殊调用方式。

  • 方式1:

使用成员变量:父类名.成员变量

使用成员方法:父类名.成员方法(self)

  • 方式2:

使用成员变量:super().成员变量

使用成员方法:super().成员方法()

class Phone:
    producer = "iP"
    cpu = "A13"

    def call_by_5g(self):
        print("父类 - 5G通话")

class newPhone(Phone):
    cpu = "A14"

    def call_by_5g(self):
        # 方式1
        print(f"父类中的处理器是:{Phone.cpu}")
        Phone.call_by_5g(self)

        # 方式2
        print(f"父类中的处理器是:{super().cpu}")
        super().call_by_5g()

        print("子类 - 5G通话")

phone = newPhone()
phone.call_by_5g()
1.8 类型注解

作用:自动提示可用方法。

功能

  • 帮助第三方IDE工具,对代码进行类型推断,协助做代码提示

  • 帮助开发者对变量进行类型注释

支持

  • 变量的类型注解

  • 函数形参泪飙和返回值的类型注解

1.8.1 变量的类型注解

语法:变量 : 类型

# 基础数据类型注解
num_1: int = 10
num_2: float = 3.14
num_3: bool = True
num_4: str = "Hello"

# 类对象类型注解
class Student:
    pass
stu: Student = Student()

# 基础容器类型注解
my_list: list = [11, 12, 13, 14, 15]
my_tuple: tuple = (6, 7, 8, 9, 10)
my_set: set = {1, 2, 3, 4, 5}
my_dict: dict = {"py": 10}
my_str: str = "python"

# 容器类型详细注解
my_list: list[int] = [11, 12, 13, 14, 15]
my_tuple: tuple[int, str, bool] = (6, "th", True)
my_set: set[int] = {1, 2, 3, 4, 5}
my_dict: dict[str, int] = {"py": 10}Student()

语法:#type : 类型

该语法做注解外,在注释中进行类型注解。

# 注释外进行类型注解
import random
num_1 = random.randint(1, 10) # type: int
num_2 = {"gate": "road"}      # type: dict[str, str]
def func():
    return 1
num_3 = func()                # type: int
类型注解的限制

类型注释仅是提示性的,不是决定性的。

num_1: int = "python" # 不会报错
num_2: str = 3.14     # 不会报错
1.8.2 函数的类型注解
形参注释

函数与方法的形参类型注释语法

def 函数方法名(形参名: 类型, 形参名: 类型, …):

    pass
def add(x:int, y: int):
    return x + y
add()

在这里插入图片描述

返回值注释

语法

def 函数方法名(形参名: 类型, …, 形参: 类型) -> 返回值类型:

    pass
def sub(x:int, y: int) -> int:
    z = x - y
    return z
print(sub(20, 10))
1.8.3 Union类型

作用:可定义联合类型注解

语法:Union[类型,…,类型]

使用Union类型前,需先导:from typing import Union

from typing import Union

my_list: list[Union[int, str]] = [10, 20, "hello", "python"]
def func(data: Union[int, str]) -> Union[int, str]:
    pass
func()

在这里插入图片描述

1.9 多态

概念:多种形态,完成某个行为时,使用不同的对象得到不同的状态。

  • 以父类做定义声明

  • 以子类做实际工作

  • 用于获取同一行为,不同状态

class Drinking:
    def drink(self):
        pass
class Coffee(Drinking):
    def drink(self):
        print("咖啡")
class Tea(Drinking):
    def drink(self):
        print("茶")
def doWork(drinking: Drinking):
    drinking.drink()

coffee = Coffee()
tea = Tea()

doWork(coffee) # 咖啡
doWork(tea) # 茶
1.9.1 抽象类

1.9代码中的父类Drinking的drink方法是空实现

该设计的意义:1.父类用来确定有哪些方法 2.具体的实现方法,由子类自行决定

该写法,称为抽象类,也可称为接口。

抽象类:含义抽象方法的类称为抽象类。

抽象方法:方法体为空实现的称为抽象方法。

抽象类好比定义一个标准,包含一些抽象方法,要求子类必须实现。

抽象类配合多态:1可完成抽象的父类设计(设计标准) 2.可完成具体的子类实现(实现标准)

class Drinking:
    def ice(self):
        pass
    def milk(self):
        pass
    def feeding(self):
        pass

class Coffee(Drinking):
    def ice(self):
        print("加冰")
    def milk(self):
        print("加燕麦牛奶")
    def feeding(self):
        print("加少糖")

class Tea(Drinking):
    def ice(self):
        print("加冰")
    def milk(self):
        print("加鲜牛奶")
    def feeding(self):
        print("加七分糖")

def doWork(drinking: Drinking):
    drinking.ice()
    drinking.milk()
    drinking.feeding()

coffee = Coffee()
tea  = Tea()
doWork(coffee)
print("--------")
rinking.feeding()

coffee = Coffee()
tea  = Tea()
doWork(coffee)
print("--------")
doWork(tea)

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

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

相关文章

鸿蒙OS开发实战:【网络管理HTTP数据请求】

一、场景介绍 应用通过HTTP发起一个数据请求&#xff0c;支持常见的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法。 二、 接口说明 HTTP数据请求功能主要由http模块提供。 使用该功能需要申请ohos.permission.INTERNET权限。 涉及的接口如下表&#xff0c;…

python爬取B站视频

参考&#xff1a;https://cloud.tencent.com/developer/article/1768680 参考的代码有点问题&#xff0c;请求头需要修改&#xff0c;上代码&#xff1a; import requests import re # 正则表达式 import pprint import json from moviepy.editor import AudioFileClip, Vid…

QT初识(2)

QT初识&#xff08;2&#xff09; 创建好项目之后&#xff0c;多了些什么东西&#xff1f;main.cppwidget.hwidget.cppwidget.ui.pro项目工程文件 我们今天来继续了解QT。如果没看过上一次QT初识的小伙伴可以点击这里&#xff1a; https://blog.csdn.net/qq_67693066/article/d…

STM32的DMA

DMA(Direct memory access)直接存储器存取,用来提供在外设和存储器之间或者存储 器和存储器之间的高速数据传输&#xff0c;无须CPU干预&#xff0c;数据可以通过DMA快速地移动&#xff0c;这就节 省了CPU的资源来做其他操作。 STM32有两个DMA控制器共12个通道(DMA1有7个通道…

基于YOLOV8+Pyqt5光伏太阳能电池板目标检测系统

1、YOLOV8算法 YOLOv8 是当前效果较好的目标检测 算法&#xff0c;它的核心网络来源于 DarkNet-53&#xff0c;该网络初次在 YOLOv3[11] 中被引入&#xff0c;并深受 ResNet[12] 的影响。DarkNet-53 使用了残差机制&#xff0c;并连续添加了卷积模块来加强其功能性。 这 53 层…

Cortex‐M3/M4/M7内核的操作模式和特权等级介绍

0 前言 如果我们是基于MCU的裸机编程&#xff0c;是不需要关心内核的操作模式和特权等级的。如果是进行RTOS的开发编程&#xff0c;我们就要必要了解一下Cortex‐M3/M4/M7内核的操作模式和特权等级&#xff0c;这在RTOS的线程切换等场合会使用到。 1 Cortex‐M3/M4/M7内核的操…

栈————顺序栈和链式栈

目录 栈 顺序栈 1、初始化顺序栈 2、判栈空 3、进栈 4、出栈 5、读栈顶元素 6、遍历 链式栈 1、初始化链式栈 2、断链式栈是否为空判 3、入栈(插入) ​编辑​编辑 4、出栈(删除) 5、读取栈顶元素 6、输出链式栈中各个节点的值&#xff08;遍历&#xff09; 栈 …

Golang | Leetcode Golang题解之第2题两数相加

题目&#xff1a; 题解&#xff1a; func addTwoNumbers(l1, l2 *ListNode) (head *ListNode) {var tail *ListNodecarry : 0for l1 ! nil || l2 ! nil {n1, n2 : 0, 0if l1 ! nil {n1 l1.Vall1 l1.Next}if l2 ! nil {n2 l2.Vall2 l2.Next}sum : n1 n2 carrysum, carry …

(React组件基础)前端八股文Day6

一 类组件与函数组件有什么异同 在React中&#xff0c;类组件和函数组件是创建组件的两种主要方式。随着React的发展&#xff0c;尤其是自Hooks在React 16.8中引入以来&#xff0c;函数组件的功能变得更加强大&#xff0c;使得它们能够更加方便地与类组件相竞争。下面是类组件…

MySQL数据库(高级)

文章目录 1.MySQL约束1.主键细节说明演示复合主键 2.not null&#xff08;非空&#xff09;3.unique&#xff08;唯一&#xff09;细节说明演示 4.外键外键示意图使用细节演示 5.check演示 6.创建表练习答案 7.自增长演示细节 2.索引1.索引机制2.创建索引演示细节 3.删除索引4.…

【苹果MAC】苹果电脑 LOGI罗技鼠标设置左右切换全屏页面快捷键

首先键盘设置->键盘快捷键 调度中心 设置 f1 f2 为移动一个空间&#xff08;就可以快捷移动了&#xff09; 想要鼠标直接控制&#xff0c;就需要下载官方驱动&#xff0c;来设置按键快捷键&#xff0c;触发 F1 F2 安装 LOGI OPTIONS Logi Options 是一款功能强大且便于使用…

Yarn的安装和使用(2):使用及问题解决

Yarn是JavaScript的依赖管理工具&#xff0c;它与npm类似&#xff0c;但提供了一些额外的性能优化和一致性保证。 Yarn的使用&#xff1a; 初始化项目&#xff1a; yarn init 此命令会引导您创建一个新的package.json文件&#xff0c;用于记录项目的元信息和依赖。 添加依赖&…

38.HarmonyOS鸿蒙系统 App(ArkUI)堆叠布局结合弹性布局

层叠布局用于在屏幕上预留一块区域来显示组件中的元素&#xff0c;提供元素可以重叠的布局。层叠布局通过Stack容器组件实现位置的固定定位与层叠&#xff0c;容器中的子元素&#xff08;子组件&#xff09;依次入栈&#xff0c;后一个子元素覆盖前一个子元素&#xff0c;子元素…

神经网络与深度学习(一)误差反传BP算法

误差反传BP算法 1多层感知机1.1XOR问题1.2多层感知机 2.BP算法2.1简述2.2详解2.2.1输入输出模型2.2.2梯度下降算法迭代2.2.3前向传播在输出端计算误差2.2.4误差反传--输出层2.2.5误差反传--隐含层2.2.6误差反传--总结 1多层感知机 1.1XOR问题 线性不可分问题&#xff1a; 无法…

正弦实时数据库(SinRTDB)的使用(10)-数据文件的无损压缩

前文已经将正弦实时数据库的使用进行了介绍&#xff0c;需要了解的可以先看下面的博客&#xff1a; 正弦实时数据库(SinRTDB)的安装 正弦实时数据库(SinRTDB)的使用(1)-使用数据发生器写入数据 正弦实时数据库(SinRTDB)的使用(2)-接入OPC DA的数据 正弦实时数据库(SinRTDB)…

LabVIEW双通道太阳射电频谱观测系统

LabVIEW双通道太阳射电频谱观测系统 开发了一个基于LabVIEW平台开发的双通道高速太阳射电频谱观测系统。该系统实时监测太阳射电爆发&#xff0c;具有随机性、持续时间短、变化快等特点。通过高速信号采集卡实现1.5 GS/s的信号采集&#xff0c;时间分辨率可达4ms&#xff0c;频…

jvm类加载机制概述

、什么是jvm的类加载机制 类加载机制是指我们将类的字节码文件所包含的数据读入内存&#xff0c;同时我们会生成数据的访问入口的一种 特殊机制。那么我们可以得知&#xff0c;类加载的最终产品是数据访问入口。 加载类文件&#xff08;即.class文件&#xff09;的方式有以下几…

ChatGPT chrome扩展下载与安装

官方下载地址 https://chromewebstore.google.com/detail/lpbhmlbicmgjpacbofijdfpcplfhakeo 截图 安装 离线安装 下载地址 https://static.xutongbao.top/app/chatgpt-chrome-crx-v0.0.7.zip 打开链接 chrome://extensions/ 人工智能学习网站 https://chat.xutongbao.to…

获取电商数据的几种方法分享

在数字化时代&#xff0c;电商数据已经成为企业决策的重要依据。无论是市场趋势的洞察、用户行为的分析&#xff0c;还是产品优化和营销策略的制定&#xff0c;都离不开电商数据的支持。本文将分享几种获取电商数据的有效方法&#xff0c;力求在干货满满的同时&#xff0c;也不…

精通【PHP循环结构知识】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…