python笔记进阶--面向对象(2)

目录

1.类和对象(实例)

1.1对象(实例)

1.1.1使用对象组织数据

1.1.2类中增加属性

1.2成员方法(类)

1.2.1类的定义和使用语法

1.2.2成员方法的使用

1.2.3self关键字的作用

1.3类和对象

2.构造方法

3.其他内置方法

4.封装

4.1封装

4.2私有成员

5.继承

5.1补全语法pass

5.2复写

5.3调用父类同名成员

6.类型注解【变量: 类型】

6.1函数(方法)类型注解

6.2 Union类型

7.多态

7.1抽象类(接口)


1.类和对象(实例)

1.1对象(实例)

实体,根据类(模板)做出来的具体东西

定义

class ClassName(object):
    <statement - 1>
    ……
    <statement - N>

class:表明这是一个类

ClassName:类的名字

():父类集合的开始和结束

object:父类的名字,定义的类继承自父类,可不写,默认object。

object:所有类的直接或间接父类

class Player(object): #object基类
    pass

tom = Player() #类的实例化(创建对象)
print(type(tom))

1.1.1使用对象组织数据

在程序中是可以做到和生活中那样,设计表格、生产表格、填写表格的组织形式的。

1. 在程序中设计表格:设计类(class)

class Student:
    name = None #记录学生姓名

2. 在程序中打印生产表格:创建对象

stu_1 = Student() #基于类创建对象
stu_2 = Student()

3. 在程序中填写表格:对象属性赋值

为学生1、学生2对象赋予名称属性值:

stu_1.name = "张蘑菇" 

stu_2.name = "李蘑菇"

例子:

1.设计一个类(类比生活中,设计一张登记表)
class Student:
    name = None   #记录学生姓名
    gender = None #记录学生性别
    nationality = None #记录学生国籍
    native_place = None #记录学生籍贯
    age = None    #记录学生年龄

个人登记表:

姓名

性别

国籍

籍贯

年龄

2.创建一个对象(类比生活中:打印一张登记表)
stu_1 = Student()

3.对象属性进行赋值(类比生活中:填写表单)
stu_1.name = "石蘑菇"
stu_1.gender = "女"
stu_1.nationality = "中国"
stu_1.native_place = "南沙群岛"
stu_1.age = 18

姓名

石蘑菇

性别

国籍

中国

籍贯

南沙群岛

年龄

18

4.获取对象中记录的信息
print(stu_1.name)
print(stu_1.native_place)

石蘑菇

南沙群岛

1.1.2类中增加属性

class Player(object):

定义对象

numbers = 0
    max_damage = 10000
    levels = ['青铜','白银','黄金','钻石','王者']

def __init__(self, name, age):  # 初始化函数(构造函数)
        self.name = name  # 实例属性
        self.age = age

self.level = level

初始化函数

(构造函数)

        weapon.numbers += 1
        if damage>weapon.max_damage:
            raise Exception('最大的伤害值是10000,请重试!') #返回错误
        if level not in weapon.levels:
            raise Exception('段位设置错误!') #返回错误

def show(self):  # 实例的方法
        print('第%d个玩家,名字是%s,来自%s段位是%s' % (Player.numbers,self.name,self.city,self.level))

实例方法

@classmethod  #装饰器
def get_players(cls):  # 类方法
    print('荣耀王者的用户数量已经达到了%d人'%cls.numbers)

类方法

@staticmethod

def isvalid(**kwargs):
if kwargs['age']>18:
    return True

 else:
    return False

infos = {'name':'mia','age':13,'city':'北京','level':'白银'}
if Player.isvalid(**infos):
    mia = Player('mia',24,'北京','白银')
else:
    print('请检查')

静态方法:

做验证、判断、计算

gun = weapon('magic_gun',1000,'青铜')
mia.show()

调用实例方法

1.2成员方法(类)

1.2.1类的定义和使用语法

类:可以定义属性用来记录数据

       可以定义函数,用来记录行为

类的使用

class 类名称:
    类的属性
    类的行为

class关键字,表示要定义的类

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

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

创建类对象

对象 = 类名称( )

1.2.2成员方法的使用

方法:定义在类内部的函数

例子

结果

类中定义成员方法

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

class Student:
   name = None
   def say_hi(self):
      print(f"我是{self.name}")

stu_1 = Student()
stu_1.name = "赵蘑菇"
stu_1.say_hi()

我是赵蘑菇

class Student:
   name = None
   def say_hi(self,msg):
      print(f"我是{self.name},{msg}")
stu_1 = Student()
stu_1.name = "赵蘑菇"
stu_1.say_hi("好")

我是赵蘑菇,好

1.2.3self关键字的作用

用来表示类对象自身的意思

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

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

1.3类和对象

class Clock:
    id = None
    price = None

属性

def ring(self):
        import winsound
        winsound.Beep(20,30)

行为

1.3.1面向对象编程

使用对象进行编程。类只是一种程序内的“设计图纸”,要基于图纸生产实体(对象),才能正常工作。

创建对象

#创建1个闹钟对象并让工作
clock1 = Clock()
clock1.id = "001"
clock1.price = 199
clock1.ring()

2.构造方法

构造方法:__init__( )方法

可以实现:在创建类对象(构造类)的时候,会自动执行。

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

class Student:
    def __init__(self, name, age):
       self.name = name
       self.age = age
       print("Student类创建了一个类对象")
stu = Student("王蘑菇", 31)
print(stu.name, stu.age)

构建类时传入的参数会自动提供给__init__方法

构建类的时候__init__方法会自动执行

结果:

Student类创建了一个类对象

王蘑菇 31

3.其他内置方法

__init__ 构造方法,是Python类内置的方法之一。

这些内置的类方法,各自有各自特殊的功能,这些内置方法称为:魔术方法

魔术方法

__init__

构造方法

__str__

字符串方法

控制类转换为字符串的行为

__lt__

> 和 < 符号比较

__le__

≥ 和 ≤ 符号比较

__eq__

==符号比较

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.age == other.age
stu1 = Student("周蘑菇", 31)
stu2 = Student("林蘑菇", 36)

print(stu1 <= stu2) 

结果:True

print(stu1 == stu2)  

结果:False

4.封装

面向对象编程,是许多编程语言都支持的一种编程思想。

简单理解是:基于模板(类)去创建实体(对象),使用对象完成功能开发。

面向对象包含3大主要特性:封装、继承、多态

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

4.1封装

封装将现实世界事物的:属性、行为。封装到类中,描述为:成员变量、成员方法

属性、行为:对用户开放的、隐藏的属性和行为

4.2私有成员

使用情况:现实事物有部分属性和行为是不公开对使用者开放的。

意义:在类中提供仅供内部使用的属性和方法,而不对外开放(类对象无法使用)

类中提供了私有成员的形式来支持。

私有成员变量

私有成员方法

定义私有成员的方式:

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

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

注:

报错

有方法无法直接被类对象使用    

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

正确

私有成员无法被类对象使用,

但可以被其它的成员使用。

5.继承

继承表示:将从父类那里继承(复制)来成员变量和成员方法(不含私有),继承以前的功能

继承分为:单继承和多继承

单继承

多继承

cLass 类名(父类1):
    类内容体

cLass 类名(父类1,…,父类N ):
    类内容体

继承→子类,被继承→父类

继承

cLass 类名(父类1,…,父类N ):
    类内容体

5.1补全语法pass

继承后不需要修改内容时,用pass

class MyPhone(Phone, NFCReader):
    pass

5.2复写

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

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

5.3调用父类同名成员

一旦复写父类成员,那么类对象调用成员的时候,就会调用复写后的新成员

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

方法一

调用父类成员

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

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

方法二

使用super()调用父类成员

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

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

6.类型注解【变量: 类型

方便静态类型检查工具,IDE等第三方工具。

类型注解:在代码中涉及数据交互的地方,提供数据类型的注解(显式的说明)。

主要功能:帮助第三方IDE工具(如PyCharm)对代码进行类型推断,协助做代码提示

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

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

变量的类型注解

无法直接看出变量类型之时会添加变量的类型注解

基础数据类型注解

变量: 类型

var_1: int = 10
var_2 : float = 3.1415926
var_3: bool = True
var_4: str = "mogu"

类对象类型注解

变量: 类型

class student:
    pass
stu : student = student()

基础容器类型注解

变量: 类型

my_list: list = [1,2,3]
my_tup1e: tuple = (1,2,3)
my_set: set = {1,2,3}
my_dict: dict = {"mogu": 666}
my_str: str = "mogu"

容器类型详细注解

变量: 类型

my_list: list[int] = [1,2,3]
my_tuple: tuple[str,int,bool] = ("itheima",666,True)
my_set: set[int] = {1,2,3}
my_dict: dict[str, int] = {"itheima" : 666}

在注释中进行类型注解

# type: 类型

var_1 = random.randint(1,10) # type:int
var_2 = json.loads(data)  # type:dict[str,int]
var_3 = func() # type:student

6.1函数(方法)类型注解

形参

注解

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

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

返回值

注解

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

def add(x: int, y: int) -> int:
    return x +y

def func(data: list[int]) -> list[int]:
    pass

6.2 Union类型

Union[类型, ......,类型]

定义联合类型注解

from typing import Union
my_1ist: list[Union[str, int]] = [1, 2, "itheima", "itcast"]
my_dict: dict[str, Union[str, int]] = { "name": "周杰轮", "age": 31}

函数中定义

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

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

7.多态

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

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对象"""
    animal.speak()
# 演示多态,使用2个子类对象来调用函数
dog = Dog()
cat = Cat()
make_noise(dog)
make_noise(cat)

多态常作用在继承关系上

比如:函数(方法)形参声明接收父类对象、实际传入父类的子类对象进行工作

即:以父类做定义声明、以子类做实际工作、用以获得同一行为, 不同状态

7.1抽象类(接口)

配合多态:完成抽象的父类设计(设计标准)

具体的子类实现(实现标准)

class Animal:
    def speak(self):
        pass

父类用来确定有哪些方法,具体的方法实现,由子类自行决定。

抽象类:含有抽象方法的类称之为抽象类

抽象方法:方法体是空实现的(pass)称之为抽象方法

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

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

相关文章

Mysql各种日志管理

文章目录 事务日志事务日志的记录过程事务日志类型事务日志的相关变量 错误日志二进制日志功能作用文件的构成日志格式查看日志删除日志 通用日志慢查询日志 Mysql日志记录着数据库在运行过程中的各种操作&#xff0c;帮助管理员定位查找问题。 事务日志 事务日志(Transaction…

方案分享 | 嵌入式指纹方案

随着智能设备的持续发展&#xff0c;指纹识别技术成为了现在智能终端市场和移动支付市场中占有率最高的生物识别技术。凭借高识别率、短耗时等优势&#xff0c;被广泛地运用在智能门锁、智能手机、智能家居等设备上。 上海航芯在2015年进入指纹识别应用领域&#xff0c;自研高性…

MySQL的安装(Linux版)

1.所需要的文件 MySQL.zip 2. 卸载自带的Mysql-libs # 查看是否存在 rpm -qa | grep mariadb# 如果存在则执行命令进行卸载 rpm -e --nodeps mariadb-libs3.在/opt目录下创建MySQL目录并上传所需要的安装包 cd /optmkdir MySQL4.按照编号顺序安装&#xff08;压缩包在解压完…

vs2010打包QT程序

一、环境 win10 、 VS2010 、 qt5.7.1 将代码在release模式下运行 运行完后会在相应的文件夹下生成exe文件&#xff0c;也会将部分dll文件拷贝到release文件夹中 二、生成可执行文件 2.1 选择“文件”->“新建”->”项目“ 2.2 在打开的对框中选择”其他类型项目…

视频素材网有哪些?7个优质无水印素材库推荐

当今社会&#xff0c;视频内容已成为最吸引眼球的媒介之一&#xff0c;无论是社交媒体的短视频还是专业制作的影片&#xff0c;都离不开高质量的视频素材。为了帮助你在茫茫网海中找到宝藏&#xff0c;下面我精选了一系列视频素材网站&#xff0c;不仅提供丰富多样的视频资源&a…

(1) 易经与命运_学习笔记

个人笔记&#xff0c;斟酌阅读 占卦的原理 三个铜板&#xff0c;正面是3&#xff0c;反面2&#xff0c;三个一起转&#xff0c;得出6,7,8,9 数字象6老阴7少阳8少阴9老阳 生数和成数 生数和成数应该说出自《河图》。其中一二三四五为生数&#xff0c;六七八九十为成数。 生…

Typst入门简明教程

文章目录 写在前面对比阅读安装Typst的安装系统路径设置VSCode的设置 用Typst写作节指令图指令表指令公式指令参考文献指令引用指令节的标签图、表、公式的标签参考文献的标签 Typst编译 Typst的<label>写法建议写在最后&#xff1a;Typst、LaTex和Word的比较 写在前面 …

面试经典150题【111-120】

文章目录 面试经典150题【111-120】67.二进制求和190.颠倒二进制位191.位1的个数136.只出现一次的数字137.只出现一次的数字II201.数字范围按位与5.最长回文子串97.交错字符串72.编辑距离221.最大正方形 面试经典150题【111-120】 六道位运算&#xff0c;四道二维dp 67.二进制…

未能加载文件或程序集socutdata或它的某一个依赖项试图加载格式不正确的程序

未能加载文件或程序集socut data或它的某一个依赖项试图加载格式不正确的程序 Socut.Data.dll找不到类型或命名空间名称 把bin目录下面 的socut.data.dll删除就行了 C#报错未能加载文件或程序集socut data或它的某一个依赖项试图加载格式不正确的程序 "/"应用程序…

逐步学习Go-并发通道chan(channel)

概述 Go的Routines并发模型是基于CSP&#xff0c;如果你看过七周七并发&#xff0c;那么你应该了解。 什么是CSP&#xff1f; "Communicating Sequential Processes"&#xff08;CSP&#xff09;这个词组的含义来自其英文直译以及在计算机科学中的使用环境。 CSP…

Android Studio详细安装教程及入门测试

Android Studio 是 Android 开发人员必不可少的工具。 它可以帮助开发者快速、高效地开发高质量的 Android 应用。 这里写目录标题 一、Android Studio1.1 Android Studio主要功能1.2 Android应用 二、Android Studio下载三、Android Studio安装四、SDK工具包下载五、新建测试…

Live800:设计与管理客户忠诚度计划,提升客户满意度与忠诚度

在当今竞争激烈的商业环境中&#xff0c;吸引新客户的成本远高于保留现有客户。因此&#xff0c;设计并实施一套有效的客户忠诚度计划&#xff0c;以提升客户满意度和忠诚度&#xff0c;已经成为企业获得长期成功的关键。文章将探讨如何设计和实施客户忠诚度计划&#xff0c;以…

ehters.js:provider

ethers.jsV5.4文档 安装ethers npm install ethers5.4.0// 引入 import { ethers } from ethersProviders /** Provider类* Provider类是对以太坊网络连接的抽象&#xff0c;为标准以太坊节点功能提供简洁、一致的接口。 */ const provider new ethers.providers.Web3Provider…

【QT入门】 Qt代码创建布局之水平布局、竖直布局详解

往期回顾&#xff1a; 【QT入门】 Qt实现自定义信号-CSDN博客 【QT入门】 Qt自定义信号后跨线程发送信号-CSDN博客 【QT入门】 Qt内存管理机制详解-CSDN博客 【QT入门】 Qt代码创建布局之水平布局、竖直布局详解 先看两个问题&#xff1a; 1、ui设计器设计界面很方便&#xf…

Soft Robotics:两栖环境下螃蟹仿生机器人的行走控制

传统水陆两栖机器人依靠轮胎或履带与表面的接触及摩擦产生推进力&#xff0c;这种对于表面接触的依赖性限制了现有水陆两栖机器人在低重力环境下&#xff08;如水中&#xff09;的机动性。利用生物自身的推进机制&#xff0c;人为激发生物运动行为&#xff0c;由活体生物与微机…

第4章:掌握标准提示,输出更精准

标准提示 标准提示&#xff0c;是引导ChatGPT输出的一个简单方法&#xff0c;它提供了一个具体的任务让模型完成。 如果你要生成一篇新闻摘要。你只要发送指示词&#xff1a;“汇总这篇新闻”。 提示公式&#xff1a;生成[任务] 生成新闻文章的摘要&#xff1a; 任务&#x…

算法打卡day29|贪心算法篇03|Leetcode 1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果

算法题 Leetcode 1005.K次取反后最大化的数组和 题目链接:1005.K次取反后最大化的数组和 大佬视频讲解&#xff1a;K次取反后最大化的数组和视频讲解 个人思路 思路清晰&#xff0c;因为是取反当然是取越小的负数越好&#xff0c;那么先按绝对值排序。如果是负数就取反&#…

python和c语言的区别是什么

Python可以说是目前最火的语言之一了&#xff0c;人工智能的兴起让Python一夜之间变得家喻户晓&#xff0c;Python号称目前最最简单易学的语言&#xff0c;现在有不少高校开始将Python作为大一新生的入门语言。本萌新也刚开始接触Python&#xff0c;发现Python与其他语言确实有…

完全二叉树的层序遍历[天梯赛]

文章目录 题目描述思路 题目描述 输入样例 8 91 71 2 34 10 15 55 18 输出样例 18 34 55 71 2 10 15 91思路 完全二叉树最后一层可以不满&#xff0c;但上面的每一层的节点数都是满的 后序遍历的顺序为"左右根"&#xff0c;我们可以用数组模拟完全二叉树&#xff0c;…

Docker进阶:Docker Swarm —弹性伸缩调整服务的副本数量

Docker进阶&#xff1a;Docker Swarm —弹性伸缩调整服务的副本数量 1、 创建一个Nginx服务&#xff08;Manager节点&#xff09;2、查看服务状态&#xff08;Manager节点&#xff09;3、测试访问&#xff08;Worker节点&#xff09;4、查看服务日志&#xff08;Manager节点&am…