Python基础知识:整理17 -> 类和对象

1 初识对象

# 1. 设计一个类:    类的属性->成员变量、 类的行为->成员方法
class Student:
    name = None  # 记录学生姓名
    gender = None   # 记录学生性别
    age = None   # 记录学生年龄
    score = None  # 记录学生成绩
    def say(self):   # 成员方法
        return (f"hello, my name is {self.name}")   # self表示类对象的本身,必须使用self才能访问该类的属性


# 2. 创建一个对象
stu1 = Student()

#  3. 给对象赋值
stu1.name = '张三'
stu1.gender = '男'
stu1.age = 18
stu1.score = 90

# 4. 打印对象的属性值
print('姓名:', stu1.name)
print('性别:', stu1.gender)
print('年龄:', stu1.age)
print('成绩:', stu1.score)
print('say:', stu1.say())

2 类和对象的关系

面向对象编程:基于类设计对象,使用对象编程(只要类设计好后,对象就可以无数次地被创建)

类和对象地关系:类是程序中的“设计图纸;对象是基于图纸生产的具体实体

class Clock:
    no = None
    price = None

    def ring(self):
        import winsound
        winsound.Beep(2000, 1000)

# 1.创建第一个对象
clock1= Clock()
clock1.no = 1
clock1.price = 200

# 2.创建第二个对象
clock2 = Clock()
clock2.no = 2
clock2.price = 300

# ...

print(clock1.no)
print(clock1.price)
print(clock2.no)
print(clock2.price)

clock1.ring()
clock2.ring()

3 类中的构造方法

使用:__init__()  方法,称之为构造方法

可以实现:

        在创建类对象的时候,会自动执行;

        在创建类对象的时候,可以将传入的参数自动传递给 __init__() 方法使用

class Student:
    name = None
    age = None
    def __init__(self, name, age):
        self.name = name    # self.name 既有赋值,也有定义的功能,上面的变量可以不写
        self.age = age
        print('正在执行构造方法')

# 创建学生对象
stu1 = Student('小明', 15)   # 这句话一执行,构造方法就执行了!!!
print(stu1.name)
print(stu1.age)

4 类中的魔术方法

class Student:
    name = None
    age = None
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 1. __str__  字符串方法
    # 可以通过 __str__ 方法控制类转换为字符串的行为
    def __str__(self):   #  如果不写这个,打印stu1会输出内存地址
        return f"学生姓名:{self.name}, 年龄:{self.age}"

    # 2.  __lt__  小于和大于符号比较方法
    def __lt__(self, other):
        return self.age < other.age

    # 3. __le__  小于等于,大于等于符号比较方法
    def __le__(self, other):
        return self.age <= other.age

    # 3. __le__  比较运算符实现方法 ==  相等
    def __eq__(self, other):
        return self.age == other.age


stu1 = Student("张三", 20)
print(stu1.name)

print(stu1)  # __str__
stu2 = Student("李四", 22)

print(stu1 < stu2)   # __lt__   不支持等于
print(stu1 > stu2)
print("----------------")

stu3 = Student("王五", 22)
print(stu2 <= stu3)
print(stu2 >= stu3)  # __le__
print("----------------")

stu4 =  Student("赵六", 20)
print(stu4 == stu1)
print(stu4 == stu2)

5 面向对象的三大特性

5.1 封装性

封装:是将现实世界中的事物在类中描述为属性和方法

私有成员变量和私有成员方法:私有成员变量和私有成员方法不能被类对象使用,但类中的其它成员可以使用访问该私有成员

class Student:
    name = None
    age = None

    __score = 50

    def __sayHello(self):
        print("hello")

    def call_by_score(self):
        if self.__score >= 60:   # 可以使用私有成员变量
            print("及格万岁")
        else:
            self.__sayHello()
            print("不及格")

stu = Student()
# print(stu.__score)   # 无法使用
# stu.__sayHello()    # 无法使用

stu.call_by_score()

5.2 继承性

5.2.1 单继承

语法: 

             class  类名(父类名):

                        类的内容体

class Phone:
    no = None
    price = None

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


class Phone2022(Phone):
    face_id = None

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

phone2022 = Phone2022()
phone2022.call_by_4g()
phone2022.no = 1100
print(phone2022.no)
phone2022.call_by_5g()

5.2.2 多继承

语法:

        class  类名(父类名1, 父类名2, ......):

                类的内容体

当继承的两个或多个父类中,有相同名字的成员,则按继承的顺序来,左边的优先  (父类名1, 父类名2, ......)

5.2.3 复写父类成员和调用父类成员

复写:

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

class Phone:
    no = None
    price = 100
    def call(self):
        print("我可以打电话")

class Phone2022(Phone):
    price = 188

    def call(self):
        print("我可以视频通话")

phone2022 = Phone2022()
print(phone2022.price)
phone2022.call()
print("---------------------")

 


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

"""
    方法2 使用super()调用父类成员
        使用成员变量:super().成员变量名
        使用成员方法:super().成员方法名(self)
"""

class Phone2023(Phone):
    price = 188

    def call(self):
        print("我可以视频通话")
        super().call()
        print(f"父类的价格为:{Phone.price}")

phone2023 = Phone2023()
print(phone2023.price)
phone2023.call()

5.3 多态性

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

函数(方法)形参声明接收父类对象;
实际传入的是父类的子类对象进行工作;
    ->  同一行为,不同状态

class Animal:
    def speak(self):     # 抽象类  pass  -> 用作顶层设计,我们不直接使用,我们使用他具体的子类
        pass

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

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


def animal_speak(animal: Animal):
    animal.speak()

dog = Dog()
cat = Cat()
animal_speak(dog)
animal_speak(cat)

6 类型注解

# 一、变量的类型注解:
"""
    语法1:
        变量名: 变量类型 = 变量值
    语法2:
        在注释中, #type: 类型

    注意:注解仅是提示的作用,变量类型和注解不对应不会导致错误
"""
import json
import random

from typing import Tuple, List

# 1. 基础数据类型的类型注解
var1: int = 10
var2: str = "hello"
var3: float = 3.14
var4: bool = True

# 2. 类对象的类型注解
class MyClass:
    pass
stu: MyClass = MyClass()

# 3. 容器数据类型的类型注解
# 列表的类型注解
my_list: list = [1, 2, 3]
my_tuple: tuple = (1, 2, 3)
my_tuple1: tuple[str, int] = ("hello", 20)
my_dict: dict = {"name": "Tom", "age": 20}

# 4.在注释中进行类型注解
var5 = random.randint(1, 10)   # type: int
var6 = json.loads('{"age": 20}')   # type: dict[str, int]



# 二、函数和方法的类型注解
"""
    语法:
        def 函数名(参数1: 参数类型, 参数2: 参数类型) -> 返回值类型:
            函数体/pass
"""
def add(x: int, y: int) -> int:
    pass



# 三、Union的类型注解  (在函数和变量中都可以使用)
"""
    语法:
        Union[类型1, 类型2, ...]
"""

# 首先导包
from typing import Union
my_list1: list[Union[int, str]] = [1, 2, "hello"]

my_dict2: dict[str, Union[str, int, bool]] = {"name": "Tom", "age": 20, "gender": True}

def func(data: Union[int, str]) -> Union[int, str]:
    pass

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

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

相关文章

工业平板定制方案_基于联发科、紫光展锐平台的工业平板电脑方案

工业平板主板采用联发科MT6762平台方案&#xff0c;搭载Android 11.0操作系统&#xff0c; 主频最高2.0GHz&#xff0c;效能有大幅提升;采用12nm先进工艺&#xff0c;具有低功耗高性能的特点。 该工业平板主板搭载了IMG GE8320图形处理器&#xff0c;最高主频为680MHz, 支持108…

019、错误处理:不可恢复错误与panic!

鉴于上一篇文章过长&#xff0c;不方便大家阅读和理解&#xff0c;因此关于Rust中的错误处理&#xff0c; 我将分以下3篇来讲。 另外&#xff0c;随着我们学习的不断深入&#xff0c;难度也会越来越大&#xff0c;但不用担心。接下来只需要让自己的脚步慢一些&#xff0c;认真搞…

软件测试|教你如何使用Python绘制出奥运五环旗

简介 我们之前介绍过使用turtle来绘制正多边形&#xff0c;但是绘制正多边形只是turtle模块最基础的使用&#xff0c;我们可以使用turtle模块绘制出更多不一样的精彩图形&#xff0c;本文就来给大家介绍一个比较简单的turtle绘图实例&#xff0c;绘制奥运五环旗。 初始化参数…

JS | JS调用EXE

JS | JS调用EXE 网上洋洋洒洒一大堆文章提供,然我还是没找打合适的方案: 注册表方案做了如下测试(可行但是不推荐?): 先,键入文件名为 myprotocal.reg 的注册表,并键入一下信息: Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\openExe] //协议名…

[开发语言][c++]:Static关键字和全局变量

Static关键字和全局变量 1. 生命周期、作用域和初始化时机2. 全局变量3. Static 关键字3.1 面向过程3.1.1 静态全局变量3.1.2 静态局部变量&#xff08;单例中会使用&#xff09;3.1.3 静态函数 3.2 面向对象3.2.1 类内静态成员变量3.2.2 类内静态成员函数 Reference 写在前面&…

有n个水塔,初始每个水塔有a[i]的水,每个水塔一次最多拿b[i]的水,现从1~n依次在水塔中取水,没取完的水全部流入下一个水塔,求最终能取多少水

题目 思路&#xff1a; 假设有两个水塔1和2&#xff0c;分类讨论&#xff1a; 1、当a1 > b1时&#xff0c;2中剩下的水是a2 - b2 a1 - b1 2、当a1 < b1时&#xff0c;1中的水不会流到2中&#xff0c;2中剩下的水是a2 - b2 即最大&#xff08;a - b) 的后缀和 #incl…

【数字电子技术课程设计】多功能数字电子钟的设计

目录 摘要 1 设计任务要求 2 设计方案及论证 2.1 任务分析 2.1.1 晶体振荡器电路 2.1.2 分频器电路 2.1.3 时间计数器电路 2.1.4 译码驱动电路 2.1.5 校时电路 2.1.6 整点报时/闹钟电路 2.2 方案比较 2.3 系统结构设计 2.4 具体电路设计 3 电路仿真测试及结…

CMake tasks.json launch.json

hehedalinux:~/Linux/cmake/cmakeClass$ tree . ├── CMakeLists.txt ├── include │ ├── Gun.h │ └── Soldier.h ├── main.cpp └── src├── Gun.cpp└── Soldier.cpp2 directories, 6 files hehedalinux:~/Linux/cmake/cmakeClass$ launch.json&am…

linux主机的免密登录

实现linux主机之间的相互免密登录 在进行远程登录的时&#xff0c;服务器和主机间进行认证阶段分为&#xff1a; 基于口令认证&#xff08;不安全&#xff0c;易被抓包拦截获取&#xff09; 客户机连接服务器时&#xff0c;服务器将自己的公钥返回给客户机 客户机会将服务器的…

【报错】NVIDIA 驱动版本不兼容 — NVIDIA driver on your system is too old

【报错】NVIDIA 驱动版本不兼容 — NVIDIA driver on your system is too old 报错信息查看torch版本查看nvidia驱动版本 报错信息 CUDA initialization: The NVIDIA driver on your system is too old (found version 11040). Please update your GPU driver by downloading …

29 旋转工具箱

效果演示 实现了一个菜单按钮的动画效果&#xff0c;当鼠标悬停在菜单按钮上时&#xff0c;菜单按钮会旋转315度&#xff0c;菜单按钮旋转的同时&#xff0c;菜单按钮旋转的8个小圆圈也会依次旋转360度&#xff0c;并且每个小圆圈的旋转方向和菜单按钮的旋转方向相反&#xff0…

【SpringMVC】常用注解(续)

在SpringMVC常用注解一文中&#xff0c;已经对一些基本注解&#xff08;有Controller、RequestMapping、ResponseBody、RequestParam&#xff09;进行了简单介绍&#xff1b;在此篇文章中&#xff0c;将继续对剩余的几个常用注解进行简单介绍&#xff0c;有RequestBody、PathVa…

ElasticSearch入门篇

目录 一、 ElasticSearch的定位 二、 什么是倒排索引 三、 什么是全文检索 四、 ElasticSearch的数据存储原理 4.1 ElasticSearch与关系型数据库的数据结构对比 4.2 ElasticSearch的倒排索引原理 一、 ElasticSearch的定位 ElasticSearch是一款开源的分布式 搜索和…

力扣算法之滑动窗口题目--水果成篮

文章目录 题目解析不同之处解决办法解决图示 代码 题目解析 首先我们先看一下题目如下图所示 题目意思也比较容易理解其实就是你有一个篮子这个篮子只能装两个不同种类的水果&#xff0c;问你最多能装多少个水果&#xff0c;这里还贴心的弄了一个样列&#xff0c;121 可以看出…

计算机组成原理 运输层

文章目录 运输层运输层协议概述进程之间的通信运输层的两个主要协议运输层的端口 用户数据报协议 UDPUDP 概述UDP 的首部格式 传输控制协议 TCP 概述TCP 最主要的特点TCP 的连接 可靠传输的工作原理停止等待协议连续 ARQ协议 TCP 报文段的首部格式TCP 可靠传输的实现以字节为单…

tcpdump常用命令

tcp首部解析&#xff1a; tcp-首部_tcp首部-CSDN博客 ref&#xff1a; Home | TCPDUMP & LIBPCAP https://www.cnblogs.com/onlyforcloud/p/4396126.html tcpdump 详细使用指南&#xff08;请尽情食用&#xff09;_tcpdump指定ip和端口-CSDN博客 【博客192】抓取报文查…

【深度学习目标检测】十五、基于深度学习的口罩检测系统-含GUI和源码(python,yolov8)

YOLOv8是一种物体检测算法&#xff0c;是YOLO系列算法的最新版本。 YOLO&#xff08;You Only Look Once&#xff09;是一种实时物体检测算法&#xff0c;其优势在于快速且准确的检测结果。YOLOv8在之前的版本基础上进行了一系列改进和优化&#xff0c;提高了检测速度和准确性。…

八、K8S metrics-server

下载yaml文件 wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability.yaml 改名&#xff1a;mv high-availability.yaml metrics-server.yaml 查看镜像地址 查看镜像地址 grep -rn image high-availability.yaml 150: …

【人工智能平台】ubuntu22.04.3部署cube-studio

简介&#xff1a;本次安装是在虚拟机上进行&#xff0c;需要给虚拟机至少分配16GB&#xff0c;分配8GB时系统会卡死。 一、环境&#xff1a; 主机环境&#xff1a;win11&#xff08;全程科学&#xff09;vm虚拟机 虚拟机&#xff1a;ubuntu22.04.3桌面版&#xff08;新装&…

Ventoy:打造你的万能启动 U 盘 | 开源日报 No.146

ventoy/Ventoy Stars: 54.3k License: GPL-3.0 Ventoy 是一个开源工具&#xff0c;用于创建支持 ISO/WIM/IMG/VHD(x)/EFI 文件的可启动 USB 驱动器。其主要功能包括将镜像文件复制到 USB 驱动器并进行引导、一次性复制多个镜像文件并提供引导菜单选择以及在本地磁盘中浏览和引…