python基本语法知识(五)——面向对象

news2024/12/30 2:15:56

类和对象

例子1

class Student:
    name = None
    gender = None
    nationality = None
    native_place = None # 籍贯
    age = None

    # 类内的成员方法,第一个参数必须为 self,
    # self相当于是当前对象
    def say_hi(self):
        print(f"大家好,我是{self.name}")
    def say_hi2(self, msg):
        print(f"大家好,我是{self.name}, {msg}")

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

# 3. 对象属性
stu1.name = "王伟"
stu1.gender = "男"
stu1.nationality = "中国"
stu1.native_place = "福建省"
stu1.age = 30

# 4.输出对象信息
print(stu1.name)
print(stu1.gender)
print(stu1.nationality)
print(stu1.native_place)
print(stu1.age)
stu1.say_hi()
stu1.say_hi2("多多关照")

输出结果:

王伟

中国

福建省

30

大家好,我是王伟

大家好,我是王伟, 多多关照

例子2:构造方法__init__()

与C++的构造函数类似:

class Student:
    # 这里声明其实不写也可以,构造方法里会自动声明+定义
    name = None
    age = None
    tel = None

    # !!
    def __init__(self, name, age, tel):
        self.name = name
        self.age = age
        self.tel = tel
        print("Student类创建了一个类对象")

stu1 = Student("陈奕迅", 39, 1292392992)
print(stu1.name)
print(stu1.age)
print(stu1.tel)

魔术方法

魔术方法类似于C++中的运算符重载

例子1:strlt

这个方法的作用就是控制类转换为字符串时的行为

class Student:

    # !!
    def __init__(self, name, age, tel):
        self.name = name
        self.age = age
        self.tel = tel
        print("Student类创建了一个类对象")

    def __str__(self):
        return f"Student对象的成员name:{self.name}, age:{self.age}, tel:{self.tel}"
    # 相当于重载 < 运算符,使得对象可以用 < 和 >
    def __lt__(self,other):
        return self.age < other.age
    # 使得对象间 >= 和 <= 可用
    def __le__(self, other):
        return self.age <= other.age

    # ==运算符重载
    def __eq__(self, other):
        return self.age == other.age

stu1 = Student("陈奕迅", 39, 1292392992)
stu2 = Student("周杰伦", 39, 1239200233)
print(stu1 < stu2) # False
print(stu1 > stu2) # False
print(stu1 <= stu2) # True
print(stu1 >= stu2) # True
print(stu1 == stu2) # 如果类内没有实现 __eq__,则比较的时内存地址,False
print(stu1)

输出结果:

Student类创建了一个类对象

Student类创建了一个类对象

False

False

True

True

True

Student对象的成员name:陈奕迅, age:39, tel:1292392992

封装

例子1: 私有成员变量和方法

以两个下划线__ 开头的变量或方法,就是私有的成员

class Phone:
    # 成员名前有 __ 就是私有成员
    __current_voltage = 0.5 # 手机当前电压

    def __keep_single_core(self):
        print("CPU以单核模式运行")

    def call_by_5g(self):
        # 只有类内
        if self.__current_voltage >= 1:
            print("5g通话已开启")
        else:
            self.__keep_single_core()
            print("电量不足,无法使用5g通话,并设置为单核模式")

phone = Phone()

phone.call_by_5g();
# 类外无法使用私有成员,如下:
# print(phone.__current_voltage)
# phone.__keep_single_core()

输出结果:

CPU以单核模式运行

电量不足,无法使用5g通话,并设置为单核模式

继承

简单的说就是复用其他类的内容

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

例子1

class Phone:
    IMEI = None
    producer ="Apple"

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

# Phone2023 继承 Phone,或称作 Phone2023 派生自 Phone
class Phone2023(Phone):
    face_id = "10001"

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

phone = Phone2023()
print(phone.producer)
phone.call_by_4g()
phone.call_by_5g()

输出结果:

Apple

4g通话

5g通话

例子2:多继承

class Phone:
    IMEI = None
    producer ="Apple"

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

class NFCReader:
    nfc_type = "第五代"
    producer = "Samsung"

    def read_card(self):
        print("NFC读卡")

    def write_card(self):
        print("NFC写卡")

class RemoteControl:
    rc_type = "红外遥控"

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

class MyPhone(Phone, NFCReader, RemoteControl):
    pass # 啥也不想写就填 pass

phone = MyPhone()
phone.call_by_4g()
phone.read_card()
phone.write_card()
phone.control()

# 注意Phone, NFCReader都有 producer 成员
# 注意这里 producer 使用的是Phone::producer,即继承中左边的类的成员
print(phone.producer)

输出结果:

4g通话

NFC读卡

NFC写卡

红外遥控开启

Apple

例子3:子类复写父类成员;子类使用父类的成员

class Phone:
    IMEI = None
    producer ="Apple"

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

class MyPhone(Phone):
    # 复写父类的成员
    producer = "Nokia"

    def call_by_5g(self):
        print("开启CPU单核模式,确保通话时省电")
        # 使用父类成员方式1
        # print(f"父类的厂商是{Phone.producer}")
        # Phone.call_by_5g(self) # 注意这种方法要传 self

        # 使用父类成员方式2 super()
        print(f"父类的厂商是{super().producer}")
        super().call_by_5g()
        print("关闭CPU单核模式,确保性能")

phone = MyPhone()
phone.call_by_5g()
print(phone.producer)

输出结果:

开启CPU单核模式,确保通话时省电

父类的厂商是Apple

5g通话

关闭CPU单核模式,确保性能

Nokia

类型的注解

给类型加上注解之后,比如给函数参数加注解,则调用函数时,智能提示就能提示输入参数类型。

一般是无法看出来的参数类型才建议加注解

例子1

tu:Student = Student()

# 基础容器类型注解
my_list: list = [1, 2, 3]
my_tuple: tuple = (1, 2, 3)
my_dict: dict = {"lisi": 44}

# 容器类型详细注释
my_list1: list[int] = [1, 2, 3]
my_tuple1: tuple[int, str, bool] = (1, "apple", False)
my_dict1: dict[str, int] = {"lisi": 44}

# 在注释中进行类型注解
var_4 = random.randint(1, 10)  # type: int
var_5 = json.loads('{"name": "wangwu"}') # type:dict[str, str]
def func():
    return 10

var_6 = func() # type: int

# 类型注解的限制
# 如果注解和实际类型不符合,pycharm提示按用户注解来
var_7: int = "nokia"
var_8: str = 222

在这里插入图片描述

例子2:函数参数类型进行注解

# 对形参类型进行注解
def add(x: int, y: int):
    return x + y

# 对返回值进行类型注解
def func(data: list) ->list:
    return data


# 类型注解只是起提示作用,下面语句仍能正常运行
print(type(func(1))) # <class 'int'>

注解:

添加注解后,调用函数按下 ctrl + p会有如下提示

在这里插入图片描述

在这里插入图片描述

例子3:union联合类型注解

from typing import Union

# 表示列表元素类型可为 int 或 str
my_list: list[Union[int, str]] = [1, 2, 3]

# 表示函数参数类型可为 int 或str
def func(data: Union[int, str]) -> Union[int, str]:
    pass

在这里插入图片描述

在这里插入图片描述

多态

例子1

class Animal:
    def speak(self):
        pass

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

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

# 根据不同参数来调用对应的对象,基类接受派生类
def make_noise(animal: Animal):
    animal.speak()

dog = Dog()
cat = Cat()
make_noise(dog)
make_noise(cat)

输出结果:

汪汪汪

喵喵喵

例子2

# 空调抽象基类
class AC:
    def cool_wind(self):
        pass

    def hot_wind(self):
        pass

    def swing_l_r(self):
        pass

class Midea_AC(AC):
    def cool_wind(self):
        print("美的空调制冷")

    def hot_wind(self):
        print("美的空调制热")

    def swing_l_r(self):
        print("美的空调左右摆风")

class GREE_AC(AC):
    def cool_wind(self):
        print("格力空调制冷")

    def hot_wind(self):
        print("格力空调制热")

    def swing_l_r(self):
        print("格力空调左右摆风")

def make_cool(ac: AC):
    ac.cool_wind()

midea_ac = Midea_AC()
gree_ac = GREE_AC()

make_cool(midea_ac)
make_cool(gree_ac)

输出:

美的空调制冷

格力空调制冷

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

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

相关文章

自学网络安全怎么规划路线?

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

HuggingFace Bert语言模型抽取句子表征向量

1. 安装相应的包 pip install transformers2. 具体代码 from transformers import BertTokenizer, BertModeltokenizer BertTokenizer.from_pretrained(bert_base_cased, cache_dir"dblp/bert_base_cased", local_files_onlyTrue) model BertModel.from_pretrain…

第七十一天学习记录:对陈正冲编著《C 语言深度解剖》中关于1、2、4,5章作者留下部分问题的学习

问&#xff1a;有如下代码。 static int j;void fun1(void) {static int i 0;i; }void fun2(void) {j 0; j; }int main() {int k 0;for (k 0; k<10; k){fun1();fun2();}return 0; }i 和 j 的值分别是什么,为什么&#xff1f; 答&#xff1a; 在这份代码中&#xff0c;变…

Dtop环球嘉年华推动Web 3.0国际电商领域的革新

随着互联网技术的与日俱进和数字经济的高速发展,国际贸易正在经历一场重大变革。其中,跨境电商作为一种新兴的商业模式,正在全球迅速崛起。然而,自2021年以来,跨境电商行业也面临着各种风险和挑战,如各国增值税新规、电商账号封禁事件以及海运价格持续上涨等冲击。这些因素共同…

Spark SQL数据帧与数据集

文章目录 一、数据帧 - DataFrame&#xff08;一&#xff09;DataFrame概述&#xff08;二&#xff09;将RDD转成DataFrame 二、数据集 - Dataset&#xff08;一&#xff09;Dataset概述&#xff08;二&#xff09;将RDD转成DataSet&#xff08;三&#xff09;DataFrame与Datas…

ATA-4000系列高压功率放大器——超声导波中的典型应用

ATA-4000系列高压功率放大器——超声导波中的典型应用 超声导波技术 超声导波(guided waves ultrasonic)技术是一项近年来广受关注的无损检测技术。导波是由于介质边界存在而被限制在介质中传播的、同时其传播方向平行于介质边界的波。超声导波较早期的研究由一些著名学者完成&…

react + antd实现动态切换主题功能(适用于antd5.x版本)

前言 在之前的几篇文章中&#xff08;React Antd实现动态切换主题功能之二&#xff08;默认主题与暗黑色主题切换&#xff09;、React Antd实现动态切换主题功能&#xff09;介绍了antd实现动态切换主题功能&#xff0c;文章里介绍的方法在antd5.x版本却不适用&#xff0c;因…

【UE5】分分钟简单使用像素流云服务(Pixel Streaming)

【UE5】分分钟简单使用像素流云服务&#xff08;Pixel Streaming&#xff09; 前言 UE5的Pixel Streaming已经封装的很好&#xff0c;简单三步实现简单的服务搭建。 安装插件打包项目运行服务 注&#xff1a;实例平台为Windows 安装插件 编辑→插件→输入查询Pixel Strea…

Java之~Bigdicmal的长度,小数点后用0补位

/*** 获取bigdicmal的长度* param number 需要截取的数字* param num 需要保留小数点后的位数* return*/ public static int checkBigDecimalLength(String number ,int num){String s getSupString(number,num);return s.length(); }/*** 补充后面数值0* param number 需要截…

5G技术学习——5GNR帧结构和空口资源

这里写目录标题 4G时域定义&#xff1a;资源划分 5GNR中时域 频域 与空域资源 循环前缀CP:背景和原理5G帧结构&#xff1a;基本框架5G slot分类 5G 频域资源5G频域资源基本概念信道带宽与传输带宽BWP定义及其应用场景 4G 时域定义&#xff1a; 帧&#xff1a;10ms&#xff0c;…

【go-zero】go-zero微服务实战系列九 聚合策略 极致优化秒杀性能(转)

上一篇文章中引入了消息队列对秒杀流量做削峰的处理,我们使用的是Kafka,看起来似乎工作的不错,但其实还是有很多隐患存在,如果这些隐患不优化处理掉,那么秒杀抢购活动开始后可能会出现消息堆积、消费延迟、数据不一致、甚至服务崩溃等问题,那么后果可想而知。本篇文章我们…

深度学习-pytorch_lightning框架使用实例

下面是我写过的一个pytorch_lightning项目的代码框架。关键代码已经省略。 模型构建 import pytorch_lightning as pl from pytorch_lightning.plugins.io import TorchCheckpointIO as tcio import torch from torch import nn import torch.nn.functional as F from torch.…

师生相逢,潇潇洒洒出品

师生相逢2023年6月10日潇潇洒洒出品骑行肩并肩 相望曾相识①遥忆多年前 青春勃发时豪情梦摘星 清纯玉壶冰感叹岁月老 友情弥久新寄情山水间 天涯不负卿①骑行路上&#xff0c;偶遇30年前的学生&#xff0c;现在是骑行群的骑友&#xff0c;共同的兴趣爱好使我们30年后再相逢&…

【服务器数据恢复】热备盘激活失败导致raid5瘫痪的数据恢复案例

服务器数据恢复环境&#xff1a; 一台EMC存储中数块磁盘组建了一组raid5磁盘阵列&#xff0c;阵列中有2块热备盘&#xff1b;上层采用ZFS文件系统&#xff0c;划分了一个lun&#xff0c;供sun小机使用。 服务器故障&检测&#xff1a; 存储在正常运行中突然崩溃无法使用&…

STM32单片机(五)第一节:EXTI外部中断

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

AST反混淆js代码——猿人学竞赛第二题

猿人学JS比赛第二题解混淆 分析代码解混淆代码结果 前一段时间参加猿人学js比赛&#xff0c;今天把第二题的还原做一下笔记。 分析代码 首先&#xff0c;我们需要对混淆js代码进行分析&#xff0c;确定还原的思路&#xff0c;才能书写解混淆代码进行还原。代码是静态的&#x…

KYOCERA Programming Contest 2023(AtCoder Beginner Contest 305)(A、B、C、D)[施工中]

文章目录 A - Water Station(模拟)B - ABCDEFG&#xff08;模拟&#xff09;C - Snuke the Cookie Picker(模拟、暴力)D - Sleep Log&#xff08;二分&#xff0c;前缀&#xff09; A - Water Station(模拟) 题意&#xff1a;在[0,100]所有 x % 5 0的地方设置一个水站&#x…

由源码生成Python可调用的dll

1. 不带参数的函数与调用 blog.csdn.net/qq 40833391/article/details/128000638python编程&#xff08;python调用dll程序&#xff09;_python 调用dll_嵌入式-老费的博客-CSDN博客思路很简单&#xff0c;只需要在Visual Studio中设置输出类型即可 1.1. 创建项目 首先创建一…

【HashMap集合】存储学生对象并遍历

HashMap集合存储学生对象并遍历 1.键是String&#xff0c;值是Student 需求&#xff1a;创建一个HashMap集合&#xff0c;键是学号(String)&#xff0c;值是学生对象(Student)。存储三个键值对元素&#xff0c;并遍历 思路&#xff1a; 定义学生类 创建HashMap集合对象 创建…

uni.navigateBack()返回上一页携带参数的实现

a页面跳转b页面&#xff0c;再b页面点击确定返回到a页面刷新列表 //b页面confirm(){let pages getCurrentPages();//当前页面let prevPage pages[pages.length - 2];//上一个页面prevPage.setData({//直接给上一个页面赋值isRefresh: true})uni.navigateBack();} 返回到a页面…