适合夜里看的php/百度seo排名规则
面向对象编程(OOP)
一.类与实例
1.类:
是对现实世界描述的一种类型,是抽象的,是实例的模板,类名采用大驼峰,定义方式为 `class 类名: pass 。
2.实例:
根据类创建的具体对象,通过类名加括号(类名()
)创建。实例是具体的,内容依赖于类。
3.self
在类的方法中,self
代表调用该方法的实例本身,在类内来代表未来的实例。通过 self
可以访问实例的属性和其他方法。
二.初始化函数 __init__
这是类的特殊方法,通过初始化 self 来初始化未来的实例,向 self 中添加数据就是向实例中添加数据。
运行结果:
三.魔法函数(特殊方法)
这些方法允许对象进行特定的操作,如字符串表示(__str__
)、长度计算(__len__
)、比较(__eq__
, __ne__
等)和算术运算(__add__
, __sub__
等)。
class MyClass:def __init__(self, name, age):print(f"初始化函数执行了")self.name = nameself.age = agedef __str__(self):return f"醒醒了:{self.name}"def __len__(self):return len(self.name)def __eq__(self, other):return self.age == other.agedef __ne__(self, other):return self.age != other.agedef __gt__(self, other):return self.age > other.agedef __ge__(self, other):return self.age >= other.agedef __lt__(self, other):return self.age < other.agedef __le__(self, other):return self.age <= other.agedef __add__(self, other):return self.age + other.agedef __sub__(self, other):return self.age - other.agedef __mul__(self, other):return self.age * other.agedef __divmod__(self, other):return divmod(self.age, other.age)def __mod__(self, other):return self.age % other.agedef __truediv__(self, other):return self.age / other.agedef __floordiv__(self, other):return self.age // other.agemc = MyClass("张飞", 18)
print(mc)
print(len(mc))mc2 = MyClass("孙尚香", 18)
print(mc == mc2, mc != mc2, mc > mc2, mc >= mc2, mc < mc2, mc <= mc2)print(mc + mc2, mc - mc2, mc * mc2, mc % mc2, divmod(mc, mc2), mc / mc2, mc // mc2)
运行结果:
四.构造函数与析构函数
- 构造函数:用于创建实例(`self`)并返回实例,可通过父类来创建实例super().__new__() 。
- 析构函数:
__del__
方法在对象被销毁时调用,用于执行清理工作。实例不再使用,销毁之前执行。
运行结果:
五.三大特性
封装:
包括数据(如名字、年纪)及数据相关的操作(如获取名字、设置名字、获取年纪、设置年纪)。
"""
Light: 灯
数据 state
操作 is_open change_state
"""class Light:def __init__(self):self.state = False # 初始灯的状态为关闭self.colors = ["红色", "绿色", "蓝色"] # 定义了三种颜色:红色、绿色、蓝色self.current = 0 # 初始颜色索引为0,即红色def is_open(self):return self.state # 返回当前灯的状态,True 表示开启,False 表示关闭def change_state(self):self.state = not self.state # 切换灯的状态,如果是开启就关闭,如果是关闭就开启def get_color(self):return self.colors[self.current] # 返回当前灯的颜色def set_color(self):self.current += 1 # 切换到下一个颜色if self.current == len(self.colors): # 如果颜色索引超过了颜色列表长度self.current = 0 # 则重新回到第一个颜色# 示例用法
l0 = Light()
# 初始状态
print(l0.is_open()) # 输出: False,灯是关闭的
print("======================")
# 切换状态
l0.change_state()
print(l0.is_open()) # 输出: True,灯现在是开启的
print("======================")
# 再次切换状态
l0.change_state()
print(l0.is_open()) # 输出: False,灯又关闭了
print(l0.get_color()) # 输出: 红色,因为当前颜色索引是0
print("======================")
# 切换颜色
l0.set_color()
print(l0.get_color()) # 输出: 绿色,因为当前颜色索引现在是1
print("======================")
l0.set_color()
print(l0.get_color()) # 输出: 蓝色,因为当前颜色索引现在是2
print("======================")
l0.set_color()
print(l0.get_color()) # 输出: 红色,因为当前颜色索引超过了列表长度,重新回到0
print("======================")
l0.set_color()
print(l0.get_color()) # 输出: 绿色,依次循环显示颜色
运行结果:
继承:
子类拥有父类的数据以及操作,子类不需要重新编写。Python 支持多继承,而 Java、C# 只支持单继承,通过接口等来实现多继承的功能。
多继承:
class MoveAble:def __init__(self, speed):self.speed = speeddef move(self):print(f"I can move, my speed is {self.speed}m/s")def __str__(self):return "我是移动类"class SpeakAble:def __init__(self, language):self.language = languagedef speak(self):print(f"I can speak {self.language}")def __str__(self):return "我是说话类"class AttackAble:def __init__(self, skill):self.skill = skilldef attack(self):print(f"使用{self.skill}发起攻击")def __str__(self):return "我是攻击类"class Person(MoveAble, SpeakAble):def __init__(self, name, speed, language):# super().__init__() 会执行第一个父类# super().__init__(speed)# 通过类名表名 需要初始化哪个父类 必须传入selfMoveAble.__init__(self, speed)SpeakAble.__init__(self, language)self.name = namedef show(self):print(f"my name is {self.name}")def __str__(self):return "我是人类"p0 = Person("小张", 50, "汉语")
p0.show()
p0.move()
p0.speak()
多态:
Python 中可以理解到处都是多态,有两种形式,一是函数同名不同参数,通过 `*args` 实现;二是父子类多态,函数名参数都相同,但实现不同。
运行结果:
六.抽象类
- 是特殊的类,内部可编写抽象方法,不能直接实例化,也可编写普通实例方法。子类继承抽象类必须实现抽象类的抽象方法
"""
抽象类:不直接实例化, 通过子类来产生实例
"""
from abc import ABC, abstractmethodclass Animal(ABC):"""抽象类:拥有抽象方法 不能直接实例化通过装饰器abstractmethod把 walk 变为抽象方法"""@abstractmethoddef walk(self):passdef eat(self):print(f"可以吃")# a0 = Animal()
# print(a0, isinstance(a0, Animal))class Dog(Animal):"""抽象类子类: 必须实现抽象类中的抽象方法"""def walk(self):print(f"摇摇尾巴")dog = Dog()
dog.eat() # 调用继承自 Animal 的 eat() 方法
print(isinstance(dog, Dog), isinstance(dog, Animal)) # 检查实例的类型class Cat(Animal):def walk(self):print(f"跳来跳去")cat = Cat()
cat.eat() # 调用继承自 Animal 的 eat() 方法
print(isinstance(cat, Cat), isinstance(cat, Animal)) # 检查实例的类型
七.类中内容
- 实例属性:向实例中添加的数据,类内通过
self
,类外通过实例。 - 实例方法:第一个形参是
self
,类内通过self
,类外通过实例 - 类属性:向类中添加数据,获取与设置直接通过类名,通过实例获取不推荐,实例不能设置类属性。
- 类方法:第一个形参一般是
cls
,带有装饰器classmethod
,目的是获取类相关信息,实例可以获取类方法但不推荐。 - 静态方法:没有特殊形参,带有装饰器
staticmethod
,通过类名调用,实例可以访问但不推荐,项目的辅助类一般使用静态方法。
class Person:MAX_ACE = 100 # 类属性,最大值MIN_ACE = 0 # 类属性,最小值@classmethoddef from_birth_year(cls, name, birth_year):current_year = 2024 # 假设当前年份是 2024age = current_year - birth_yearreturn cls(name, age) # 返回一个新的 Person 实例@staticmethoddef is_adult(age):return age > 18 # 静态方法,判断是否成年def __init__(self, name, age):self.name = name # 实例属性,姓名self.age = age # 实例属性,年龄def __str__(self):return f"名字:{self.name}, 年龄:{self.age}" # 返回对象描述的字符串def set_name(self, name):self.name = name # 设置姓名的实例方法def get_name(self):return self.name # 获取姓名的实例方法# 创建一个 Person 对象
p0 = Person("张飞", 20)
# 输出对象的 name 和 age 属性
print(p0.name, p0.age) # 输出: 张飞 20
# 使用 __str__ 方法打印对象的字符串表示
print(p0) # 输出: 名字:张飞, 年龄:20
# 使用 set_name 方法修改 name 属性
p0.set_name("关羽")
# 再次打印对象的字符串表示和获取名字
print(p0, p0.get_name()) # 输出: 名字:关羽, 年龄:20# 访问类属性
print(Person.MAX_ACE) # 输出: 100
print(Person.MIN_ACE) # 输出: 0# 修改类属性
Person.MIN_ACE = 10
print(Person.MIN_ACE) # 输出: 10# 通过实例访问类属性(不推荐这样做)
print(p0.MIN_ACE, p0.MAX_ACE) # 输出: 10 100# 尝试通过实例修改类属性(这不会修改类的属性,而是创建了一个实例属性)
p0.MAX_ACE = 200
print(Person.MIN_ACE, p0.MAX_ACE) # 输出: 10 200# 使用类方法创建 Person 对象
p2 = Person.from_birth_year("关羽", 1990)
print(p2) # 输出: 名字:关羽, 年龄:34# 使用静态方法判断年龄是否成年
print(Person.is_adult(20)) # 输出: True
print(Person.is_adult(15)) # 输出: False
八.动态添加内容
Python 的动态性允许在运行时向类中添加新的属性、方法等。
import typesclass Person:pass# # 在实例上添加属性 向实例中添加实例数据 其他实例无影响
p0 = Person()
p = Person()
p.name = "赵云"
print(p.name)# 添加实例方法 # 向实例中添加实例数据 其他实例无影响
def my_set_name(self, name):self.name = namep.set_name = types.MethodType(my_set_name, p)
p.set_name("关羽")
print(p.name)
# 向类中添加类属性 类可以正常访问 所有实例均可访问
Person.MAX_AGE = 120
print(Person.MAX_AGE, p.MAX_AGE, p0.MAX_AGE)@classmethod
def my_info(cls):print(cls.__bases__)# 向类中添加类方法 方法格式符合类方法格式 类与所有实例均可访问
Person.info = my_info
Person.info()
p0.info()
p.info()@staticmethod
def my_max(x, y):return x if x > y else y# 向类中添加静态方法 方法要符合静态方法格式 类与实例均可访问
Person.max = my_maxprint(Person.max(10, 20), p.max(50, 100), p0.max(200, 500))
九.数据的访问级别
- 公有:普通名字,类内、类外、子类都可以使用。。
- 私有:以双下划线
__
开头的属性或方法,在类外部不能直接访问,但可以通过类的公有方法间接访问。 - 保护(Python 中不严格区分):以单下划线
_
开头的属性或方法,遵在类内可以访问,在子类可以访问,在类外可强制访问。
"""
数据的访问级别公有类型public普通名字类内和类外,子类都可以使用私有类型private以_ _开头只能在类内访问保护类型protect在类内可以访问在子类中可以访问在类外可以强制访问
"""class Person:def __init__(self, name, age, sex):self.name = nameself.__age = ageself._sex = sexdef _set_sex(self, sex):self._sex = sexdef _get_sex(self):return self._sexdef __set_age(self, age):self.__age = agedef __get_age(self):return self.__agedef get_name(self):return self.namedef set_name(self, name):self.name = namedef __str__(self):return f"name:{self.name},age:{self.__age},sex:{self._sex}"# 公有
p0 = Person("张飞", 20, "男") # 私有只能在类内访问 age
print(p0)
p0.set_name("张菲菲")
print(p0.name, p0.get_name())
# 保护
p0._set_sex("女")
print(p0._get_sex())
十.属性封装与 property
- 口头称呼:类封装数据与操作,属性与行为,包括类属性、实例属性、公有属性、私有属性、保护属性。
property
:包括fget
(获取触发,@property
)和fset
(设置触发,@属性名.setter
)装饰器。
class Person:def __init__(self, name, age, sex, height):self.__name = nameself.age = ageself.__sex = sexself.__height = height@propertydef height(self):return self.__height@height.setterdef height(self, height):self.__height = heightdef __get_sex(self):return self.__sexdef __set_sex(self, sex):if sex in ["男", "女"]:self.__sex = sexelse:print("设置失败")# 封装真正的属性sex = property(__get_sex, __set_sex)def get_name(self):return self.__namedef set_name(self, name):if 2 <= len(name) <= 4:self.__name = nameelse:print("设置失败")p = Person("张飞", 20, "男", 190)# 获取 设置age 直接使用 (容易产生不合法数据)
print(p.age)
p.age = -30
print(p.age)
print("=============================")
# 获取设置name 需要通过函数 数据安全
print(p.get_name())
p.set_name("赵云")
print(p.get_name())
print("=============================")
# 使用 property 获取和设置 sex
print(p.sex)
p.sex = "其他"
print(p.sex)
print("=============================")
print(p.height)
p.height = 200
print(p.height)
十一.单例模式
- 只有一个实例,通过控制构造函数判定是否需要重新生成实例,第一次生成后放入类属性,以后返回第一次生成的实例。
class Person:pass# 每次调用类都可以生成一个新的实例
p1 = Person()
p2 = Person()
p3 = Person()print(p1 is p2, p2 is p3, p3 is p1)class Manage(object):instance = Nonedef __new__(cls, *args, **kwargs):"""对构造函数进行控制 不是每次都生成新的实例1. 对类属性instance判断 如果为空 就构造一个实例 并且把实例赋予instance2. 对类属性instance判断 如果不为空 则直接把他返回"""if not Manage.instance:Manage.instance = super().__new__(cls)return Manage.instancedef __init__(self):"""初始化函数 初始化实例 向self中添加内容"""print(f"初始化函数执行了")m1 = Manage()
m2 = Manage()
print(m1 is m2, m1 is None, m2 is None)class BaseManage:def __new__(cls, *args, **kwargs):if not hasattr(BaseManage, "instance"):obj = super().__new__(cls)setattr(BaseManage, "instance", obj)return getattr(BaseManage, "instance")m1 = BaseManage()
m2 = BaseManage()
print(m1 is m2)class SystemManage(BaseManage):passsm1 = SystemManage()
sm2 = SystemManage()
print(sm1 is sm2)
print(isinstance(sm1, SystemManage), isinstance(sm1, BaseManage))
相关文章:

一文让你学会python:面向对象
面向对象编程(OOP) 一.类与实例 1.类: 是对现实世界描述的一种类型,是抽象的,是实例的模板,类名采用大驼峰,定义方式为 class 类名: pass 。 2.实例: 根据类创建的具体对象&…...

mac电脑安装 docker镜像 btpanel/baota
PS:docker链接:https://hub.docker.com/r/btpanel/baota 1、将docker下载到本地,然后运行端口映射 docker run -d --restart unless-stopped --name baota -p 8888:8888 -p 22:22 -p 443:443 -p 80:80 -p 888:888 -v ~/website_data:/www/w…...

Python写UI自动化--playwright(pytest.ini配置)
在 pytest.ini 文件中配置 playwright 的选项可以更好地控制测试执行的过程。 在终端输入pytest --help,可以找到playwright的配置参数 目录 1. --browser{chromium,firefox,webkit} 2. --headed 3. --browser-channelBROWSER_CHANNEL 4. --slowmoSLOWMO 5. …...

java实现序列化操作
Java序列化是一种将对象转换为字节流的过程,以便在网络上传输或将对象持久化到磁盘中。在Java中,实现序列化的关键是实现Serializable接口。当一个类实现了Serializable接口时,它可以被Java序列化机制序列化成字节流,然后再反序列…...

视频帧的概念
一个视频帧是视频中的单一静态图像。视频帧的概念与电影胶片中的单一帧类似,视频帧序列的快速播放形成了连续运动的视觉效果。以下是视频帧的详细解释: 视频帧的定义: 视频帧:视频中的单一静态图像。视频是由一系列连续的帧按一定…...

卫星导航系统的应用领域与发展前景
当人们提到卫星导航系统,往往会联想到车载导航仪或手机上的地图应用。然而,卫星导航系统的应用远不止于此,它在许多领域都发挥着重要作用。下面将介绍几个卫星导航系统的应用领域及其发展前景。首先是海洋航行安全领域。在过去,海…...

FPGA开发——数码管的使用(二)
一、概述 在上一篇文章中我们针对单个数码管的静态显示和动态显示进行了一个设计和实现,这篇文章中我们针对多个数码管同时显示进行一个设计。这里和上一篇文章唯一不同的是就是数码管位选进行了一个改变,原来是单个数码管的显示,所以位选就直…...

技术汇总记录笔记5:在 C++ 中,如何使用正则表达式来验证一个字符串是否只包含数字?
在C中,你可以使用 <regex> 头文件中定义的正则表达式功能来验证一个字符串是否只包含数字。以下是一个基本的示例,展示如何使用正则表达式来检查一个字符串是否完全是数字: #include <iostream> #include <string> #inclu…...

ai模特换装软件哪个好用?不知道怎么穿搭就用这几个
最近#紫色跑道的city穿搭#风靡全网,大家纷纷晒出自己的紫色风情。 可一想到衣橱里堆积如山的衣服和钱包的“瘦身计划”,是不是有点小纠结? 别怕,科技来救场!那就是“一键换装在线工具”,让你无需剁手&…...

HCL实验2:VLAN
目的:让PC_3和PC_5处于vlan1, PC_4和PC_6处于vlan2 SW1的配置命令: vlan 2 port GigabitEthernet 1/0/2 quit int g1/0/3 port link-type trunk port trunk permit vlan all quit SW2的配置命令: vlan 2 port GigabitEthernet 1/0/2 quit int g1/0/3 p…...

输出总分题目
题目描述 依次输入三位同学的语文、数学和英语成绩,依次输出他们的总分。 输入输出格式 输入 三行,每行三个整数,用空格隔开,分别表示这三个同学的语文、数学和英语成绩。 输出 一行三个整数,用空格隔开…...

自定义协议(应用层协议)——网络版计算机基于TCP传输协议
应用层:自定义网络协议:序列化和反序列化,如果是TCP传输的:还要关心区分报文边界(在序列化设计的时候设计好)——粘包问题 ——两个问题:粘包、序列化反序列化 1、首先想要使用TCP协议传输的网…...

在jmeter中使用javascript脚本
工作上遇到一个压力测试的需求,需要测试几个考试相关的接口。其中有一个获取试题详情的接口,和一个提交答题信息的接口。后一个接口以上一接口的返回内容为参数,添加上用户的答案即可。jmeter提供了非常多的方式可以实现该需求,这…...

[Bugku] web-CTF靶场详解!!!
平台为“山东安信安全技术有限公司”自研CTF/AWD一体化平台,部分赛题采用动态FLAG形式,避免直接抄袭答案。 平台有题库、赛事预告、工具库、Writeup库等模块。 ------------------------------- Simple_SSTI_1 启动环境: 页面提示传入参数f…...

系统架构师(每日一练11)
每日一练 1.CORBA服务端构件模型中,()是CORBA对象的真正实现,负责完成客户端请求答案与解析 A.伺服对象(Servant) B.对象适配器(Object Adapter) C.对象请求代理(Object Request Broker) D.适配器激活器(AdapterActivator) 2.DMA(直接存储器访问)工作方…...

【前端】fis框架学习
文章目录 1. 介绍2. 安装 1. 介绍 FIS是专为解决前端开发中自动化工具、性能优化、模块化框架、开发规范、代码部署、开发流程等> 问题的工具框架 使用FIS我们可以快速的完成各种前端项目的资源压缩、合并等等各种性能优化工作,同时FIS还提> 供了大量的开发辅…...

STM32高级运动控制系统教程
目录 引言环境准备高级运动控制系统基础代码实现:实现高级运动控制系统 4.1 传感器数据采集模块 4.2 数据处理与运动控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:运动控制与优化问题解决方案与优化收尾与总结 1. 引言 高级运动…...

链式栈,队列与树形结构
链式栈 链式存储的栈 实现方式:可以使用单向链表完成 对单向链表进行头插(入栈)、头删(出栈),此时链表的头部就是链栈的栈顶,链表的尾部,就是链栈的栈底 队列 概念 队列&#…...

Android历史版本与APK文件结构
前言 在移动设备日益普及的今天,Android系统已经成为全球最流行的移动操作系统。作为Android开发者或逆向工程师,了解Android系统的演进历史以及APK文件的基本结构是非常重要的。本文将详细介绍Android历史版本的演变以及APK的基本结构。 一、Android历…...

文件解析漏洞集合
IIS解析漏洞 IIS6 目录解析 在网站下建立文件夹的名字为.asp/.asa 的文件夹,其目录内的任何扩展名的文件都被IIS当作asp 文件来解析并执行。 这里显示的是 1.asp下的1.jpg,按照道理来说里面的文件是一个图片,但是访问的话,会出…...

如何利用大语言模型进行半监督医学图像分割?这篇文章给出了答案
PS:写在前面,近期感谢很多小伙伴关注到我写的论文解读,我也会持续更新吖~同时希望大家多多支持本人的公主号~ 想了解更多医学图像论文资料请移步公主👸号哦~~~后期将持续更新!! 关注我,让我们一…...

库文件的制作和makefile文件操作基础实现
库文件包括静态库和动态库: 制作动态库命令如下: gcc -fPIC -shared xxx.c xxx.c -o libxxx.so xxx表示文件名 最后会生成一个libxxx.so文件 。这个so文件就是库文件。(若是用到了自己写的.c和.h文件,需要在同一目录下哦&…...

【Linux】进程创建进程终止进程等待
目录 一、进程创建1.1 写时拷贝1.2 frok的常规用法1.3 fork调用失败的原因 二、进程终止2.1 进程退出码2.2 进程退出方式2.2.1 exit函数的使用2.2.2 _exit函数的使用2.2.3 exit函数与_exit函数的区别 2.3 进程信号 三、进程等待3.1 进程等待的必要性3.2 进程等待的方式3.2.1 wa…...

编程的进阶和并发之路
编程的进阶和并发之路 博主在这谈并发,是因为单进程的资源是全局共享,函数作为局部空间来分担分布式计算的过程,掌握并发等于熟悉流式计算和程序执行的通量快速到达结束点。在大数据初期阶段,经验开发缺乏很多模拟数据࿰…...

文件系统 --- 文件结构体,文件fd以及文件描述符表
序言 在编程的世界里,文件操作是不可或缺的一部分。无论是数据的持久化存储、日志记录,还是简单的文本编辑,文件都扮演着至关重要的角色。然而,当我们通过编程语言如 C、Java 等轻松地进行文件读写时,背后隐藏的复杂机…...

【第三节】python中的函数
目录 一、函数的定义 二、函数的调用 三、函数的参数 3.1 可变与不可变对象 3.2 函数参数传递 3.3 参数类型 四、匿名函数 五、函数的return语句 六、作用域 七、python的模块化 八、 main 函数 一、函数的定义 函数是经过精心组织、可重复使用的代码片段࿰…...

“论云原生架构及其应用”写作框架软考高级论文系统架构设计师论文
论文真题 近年来,随着数字化转型不断深入,科技创新与业务发展不断融合,各行各业正在从大工业时代的固化范式进化成面向创新型组织与灵活型业务的崭新模式。在这一背景下,以容器和微服务架构为代表的云原生技术作为云计算服务的新…...

深度剖析Google黑科技RB-Modulation:告别繁琐训练,拥抱无限创意生成和风格迁移!
给定单个参考图像,RB-Modulation提供了一个无需训练的即插即用解决方案,用于(a)风格化和(b)具有各种提示的内容样式组合,同时保持样本多样性和提示对齐。例如,给定参考样式图像(例如“熔化的黄金3d渲染样式”)和内容图像(例如(a)“狗”),RB-Modulation方法可以坚持所需的提…...

react native 和 flutter 区别
React Native 和 Flutter 都是用于构建跨平台移动应用的优秀框架,各有其优点和适用场景。 1. React Native 1.1 优点 | 基于 JavaScript 生态:对于熟悉 JavaScript 和 React 的开发者来说,学习成本相对较低,能够利用大量现有的 …...

ITSS服务经理/ITSS服务工程师,招投标需要准备吗?
信息技术服务标准(ITSS)是中国首套完整的信息技术服务标准体系,全面规定了IT服务产品及其组成要素的标准化实施,旨在提供可信赖的IT服务。 在国际竞争日益激烈的背景下,推动国内标准的国际化已成为广泛共识࿰…...