python对象

  • 我们目前所学习的对象都是Python内置的对象
  • 但是内置对象并不能满足所有的需求,所以我们在开发中经常需要自定义一些对象
  • 类,简单理解它就相当于一个图纸。在程序中我们需要根据类来创建对象
  • 类就是对象的图纸!
  • 我们也称对象是类的实例(instance)
  • 如果多个对象是通过一个类创建的,我们称这些对象是一类对象
  • 像 int() float() bool() str() list() dict() … 这些都是类
  • a = int(10) # 创建一个int类的实例 等价于 a = 10
  • 我们自定义的类都需要使用大写字母开头,使用大驼峰命名法(帕斯卡命名法)来对类命名
  • 类也是一个对象!
  • 类就是一个用来创建对象的对象!
  • 类是type类型的对象,定义类实际上就是定义了一个type类型的对象

类的定义

尝试定义一个表示人的类

class Person :# 在类的代码块中,我们可以定义变量和函数# 在类中我们所定义的变量,将会成为所有的实例的公共属性# 所有实例都可以访问这些变量name = 'swk' # 公共属性,所有实例都可以访问# 在类中也可以定义函数,类中的定义的函数,我们称为方法# 这些方法可以通过该类的所有实例来访问def say_hello(self) :# 方法每次被调用时,解析器都会自动传递第一个实参# 第一个参数,就是调用方法的对象本身,#   如果是p1调的,则第一个参数就是p1对象#   如果是p2调的,则第一个参数就是p2对象# 一般我们都会将这个参数命名为self# say_hello()这个方法,可以显示如下格式的数据:#   你好!我是 xxx#   在方法中不能直接访问类中的属性print('你好!我是 %s' %self.name)

创建Person的实例

p2 = Person()print(p2.name)

在这里插入图片描述

  • 调用方法,对象.方法名()
  • 方法调用和函数调用的区别
  • 如果是函数调用,则调用时传几个参数,就会有几个实参
  • 但是如果是方法调用,默认传递一个参数,所以方法中至少要定义一个形参
修改p1的name属性
p1.name = '猪八戒'
p2.name = '沙和尚'p1.say_hello() # '你好!我是 猪八戒'
p2.say_hello() # '你好!我是 沙和尚'

在这里插入图片描述

del p2.name # 删除p2的name属性print(p1.name)
print(p2.name)

在这里插入图片描述

class Dog:'''表示狗的类'''def __init__(self , name , age , gender , height):self.name = nameself.age = ageself.gender = genderself.height = heightdef jiao(self):'''狗叫的方法'''print('汪汪汪~~~')def yao(self):'''狗咬的方法'''  print('我咬你~~')def run(self):print('%s 快乐的奔跑着~~'%self.name)     d = Dog('小黑',8,'male',30)# 目前我们可以直接通过 对象.属性 的方式来修改属性的值,这种方式导致对象中的属性可以随意修改
#   非常的不安全,值可以任意修改,不论对错
# 现在我们就需要一种方式来增强数据的安全性
#   1.属性不能随意修改(我让你改你才能改,不让你改你就不能改)
#   2.属性不能修改为任意的值(年龄不能是负数)
d.name = '阿黄'
d.age = -10
d.run()print(d.age)

在这里插入图片描述

封装

封装是面向对象的三大特性之一
封装指的是隐藏对象中一些不希望被外部所访问到的属性或方法
如何隐藏一个对象中的属性?

  • 将对象的属性名,修改为一个外部不知道的名字
    如何获取(修改)对象中的属性?
  • 需要提供一个getter和setter方法使外部可以访问到属性
  • getter 获取对象中的指定属性(get_属性名)
  • setter 用来设置对象的指定属性(set_属性名)
    使用封装,确实增加了类的定义的复杂程度,但是它也确保了数据的安全性
  • 1.隐藏了属性名,使调用者无法随意的修改对象中的属性
  • 2.增加了getter和setter方法,很好的控制的属性是否是只读的
    如果希望属性是只读的,则可以直接去掉setter方法
    如果希望属性不能被外部访问,则可以直接去掉getter方法
  • 3.使用setter方法设置属性,可以增加数据的验证,确保数据的值是正确的
  • 4.使用getter方法获取属性,使用setter方法设置属性
    可以在读取属性和修改属性的同时做一些其他的处理
  • 5.使用getter方法可以表示一些计算的属性
 目前我们可以直接通过 对象.属性 的方式来修改属性的值,这种方式导致对象中的属性可以随意修改
- 非常的不安全,值可以任意修改,不论对错
- 现在我们就需要一种方式来增强数据的安全性
- 1.属性不能随意修改(我让你改你才能改,不让你改你就不能改)
- 2.属性不能修改为任意的值(年龄不能是负数)
class Dog:'''表示狗的类'''def __init__(self , name , age):self.hidden_name = nameself.hidden_age = agedef say_hello(self):print('大家好,我是 %s'%self.hidden_name) def get_name(self):'''get_name()用来获取对象的name属性'''    # print('用户读取了属性')return self.hidden_namedef set_name(self , name):# print('用户修改了属性')self.hidden_name = namedef get_age(self):return self.hidden_agedef set_age(self , age):if age > 0 :self.hidden_age = age    
d = Dog('旺财',8)
print(d.get_age())

在这里插入图片描述

d = Dog('旺财',8)# 调用setter来修改name属性 
d.set_name('小黑')
d.set_age(-10)d.say_hello()
print(d.get_age())

在这里插入图片描述

property装饰器

  • property装饰器,用来将一个get方法,转换为对象的属性
  • 添加为property装饰器以后,我们就可以像调用属性一样使用get方法
  • 使用property装饰的方法,必须和属性名是一样的
class Person:def __init__(self,name,age):self._name = nameself._age = age@property    def name(self):print('get方法执行了~~~')return self._name# setter方法的装饰器:@属性名.setter@name.setter    def name(self , name):print('setter方法调用了')self._name = name        @propertydef age(self):return self._age@age.setter    def age(self , age):self._age = age   p = Person('猪八戒',18)p.name = '孙悟空'
p.age = 28print(p.name,p.age)

在这里插入图片描述

  • 使用__开头的属性,实际上依然可以在外部访问,所以这种方式我们一般不用
  • 一般我们会将一些私有属性(不希望被外部访问的属性)以_开头
  • 一般情况下,使用_开头的属性都是私有属性,没有特殊需要不要修改私有属性
class Person:def __init__(self, name, age):self.__name = name  # 私有属性,调用会报错self.age = age # 公开属性,调用不会报错def get_name(self):return self.__namedef get_age(self):return self.agedef set_name(self, name):self.__name = namep = Person('孙悟空', 12)
print(p.age)
print(p.__name)

在这里插入图片描述

继承

  • 有一个类,能够实现我们需要的大部分功能,但是不能实现全部功能
  • 如何能让这个类来实现全部的功能呢?
  • ① 直接修改这个类,在这个类中添加我们需要的功能
    修改起来会比较麻烦,并且会违反OCP原则
  • ② 直接创建一个新的类
    创建一个新的类比较麻烦,并且需要大量的进行复制粘贴,会出现大量的重复性代码
  • ③ 直接从Animal类中来继承它的属性和方法
    继承是面向对象三大特性之一
    通过继承我们可以使一个类获取到其他类中的属性和方法
    在定义类时,可以在类名后的括号中指定当前类的父类(超类、基类、super)
    子类(衍生类)可以直接继承父类中的所有的属性和方法
  • 通过继承可以直接让子类获取到父类的方法或属性,避免编写重复性的代码,并且也符合OCP原则
  • 把要继承的类当作参数传入传入一个类,这个类就继承了参数类
# 定义一个类 Animal(动物)
#   这个类中需要两个方法:run() sleep() 
class Animal:def run(self):print('动物会跑~~~')def sleep(self):print('动物睡觉~~~')# todo 把要继承的类当作参数传入传入一个类,这个类就继承了参数类class Dog(Animal):def bark(self):print('汪汪汪~~~')def run(self):print('狗跑~~~~')class Hashiqi(Dog):def fan_sha(self):print('我是一只傻傻的哈士奇')# todo 实例化 Dog类
d = Dog()
print("Dog类的方法")
d.bark()
print("Dog类继承的Animal的方法")
d.sleep()hsq = Hashiqi()
print("Hashiqi类继承的Animal的方法")
hsq.fan_sha()
print("Hashiqi类继承的Dog类,Dog类继承了Animal的方法,所以Hashiqi可以使用Animal的方法,Hashiqi相当于间接的继承了Animal")
hsq.sleep()
print("Hashiqi类继承的Dog的方法")
hsq.bark()

在这里插入图片描述

重写

如果在子类中如果有和父类同名的方法,则通过子类实例去调用方法时,
会调用子类的方法而不是父类的方法,这个特点我们成为叫做方法的重写(覆盖,override)

  • 当我们调用一个对象的方法时
  • 会优先去当前对象中寻找是否具有该方法,如果有则直接调用
  • 如果没有,则去当前对象的父类中寻找,如果父类中有则直接调用父类中的方法,
  • 如果没有,则去父类的父类中寻找,以此类推,直到找到object,如果依然没有找到,则报错
class A(object):def test(self):print('AAA')class B(A):def test(self):print('BBB')class C(B):def test(self):print('CCC')   # 创建一个c的实例
c = C()
c.test()

在这里插入图片描述

类中的属性和方法

# 定义一个类
class A(object):# 类属性# 实例属性# 类方法# 实例方法# 静态方法# 类属性,直接在类中定义的属性是类属性#   类属性可以通过类或类的实例访问到#   但是类属性只能通过类对象来修改,无法通过实例对象修改count = 0def __init__(self):# 实例属性,通过实例对象添加的属性属于实例属性#   实例属性只能通过实例对象来访问和修改,类对象无法访问修改self.name = '孙悟空'# 实例方法#   在类中定义,以self为第一个参数的方法都是实例方法#   实例方法在调用时,Python会将调用对象作为self传入  #   实例方法可以通过实例和类去调用#       当通过实例调用时,会自动将当前调用对象作为self传入#       当通过类调用时,不会自动传递self,此时我们必须手动传递selfdef test(self):print('这是test方法~~~ ', self)# 类方法# 在类内部使用 @classmethod 来修饰的方法属于类方法# 类方法的第一个参数是cls,也会被自动传递,cls就是当前的类对象#   类方法和实例方法的区别,实例方法的第一个参数是self,而类方法的第一个参数是cls#   类方法可以通过类去调用,也可以通过实例调用,没有区别@classmethoddef test_2(cls):print('这是test_2方法,他是一个类方法~~~ ', cls)print(cls.count)# 静态方法# 在类中使用 @staticmethod 来修饰的方法属于静态方法  # 静态方法不需要指定任何的默认参数,静态方法可以通过类和实例去调用  # 静态方法,基本上是一个和当前类无关的方法,它只是一个保存到当前类中的函数# 静态方法一般都是一些工具方法,和当前类无关@staticmethoddef test_3():print('test_3执行了~~~')a = A()
# 实例属性,通过实例对象添加的属性属于实例属性
a.count = 10
A.count = 100
print('A ,', A.count)
print('a ,', a.count)
print('a ,', a.name)
A.test_3()
a.test_3()
print("实例属性只能通过实例对象来访问和修改,类对象无法访问修改")
print('A ,', A.name)

在这里插入图片描述

垃圾回收

  • 在Python中有自动的垃圾回收机制,它会自动将这些没有被引用的对象删除
  • 所以我们不用手动处理垃圾回收
# 就像我们生活中会产生垃圾一样,程序在运行过程当中也会产生垃圾
# 程序运行过程中产生的垃圾会影响到程序的运行的运行性能,所以这些垃圾必须被及时清理
# 没用的东西就是垃圾
# 在程序中没有被引用的对象就是垃圾,这种垃圾对象过多以后会影响到程序的运行的性能
#   所以我们必须进行及时的垃圾回收,所谓的垃圾回收就是讲垃圾对象从内存中删除
# 在Python中有自动的垃圾回收机制,它会自动将这些没有被引用的对象删除,
#   所以我们不用手动处理垃圾回收class A:def __init__(self):self.name = 'A类'# del是一个特殊方法,它会在对象被垃圾回收前调用def __del__(self):print('A()对象被删除了~~~',self)a = A()
b = a # 又使用一个变量b,来引用a对应的对象print(a.name)# a = None # 将a设置为了None,此时没有任何的变量对A()对象进行引用,它就是变成了垃圾
# b = None
# del a
# del b
input('回车键退出...')

在这里插入图片描述

模块(module)

模块化,模块化指将一个完整的程序分解为一个一个小的模块

  • 通过将模块组合,来搭建出一个完整的程序
  • 不采用模块化,统一将所有的代码编写到一个文件中
  • 采用模块化,将程序分别编写到多个文件中

模块化的特点:

  • ① 方便开发
  • ② 方便维护
  • ③ 模块可以复用!

在一个模块中引入外部模块
① import 模块名 (模块名,就是python文件的名字,注意不要py)
② import 模块名 as 模块别名

  • 可以引入同一个模块多次,但是模块的实例只会创建一个
  • import可以在程序的任意位置调用,但是一般情况下,import语句都会统一写在程序的开头
  • 在每一个模块内部都有一个__name__属性,通过这个属性可以获取到模块的名字
  • __name__属性值为 __main__的模块是主模块,一个程序中只会有一个主模块
    主模块就是我们直接通过 python 执行的模块

包 (Package)

  • 包也是一个模块
  • 当我们模块中代码过多时,或者一个模块需要被分解为多个模块时,这时就需要使用到包
  • 普通的模块就是一个py文件,而包是一个文件夹
  • 包中必须要一个一个 init.py 这个文件,这个文件中可以包含有包中的主要内容

标准库

  • 为了实现开箱即用的思想,Python中为我们提供了一个模块的标准库
  • 在这个标准库中,有很多很强大的模块我们可以直接使用,
  • 并且标准库会随Python的安装一同安装
  • sys模块,它里面提供了一些变量和函数,使我们可以获取到Python解析器的信息
  • 或者通过函数来操作Python解析器
# 引入sys模块
import sys
# sys.argv
# 获取执行代码时,命令行中所包含的参数
# 该属性是一个列表,列表中保存了当前命令的所有参数
print(sys.argv)

在这里插入图片描述

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

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

相关文章

JAVA--IO流

一、IO流什么? I/O是Input/output的缩写,用于处理设备之间的数据传输。如读/写文件、网络通讯。 java程序中,对于数据的输入、输出是以流(Stream)的方式进行。 Java.io包下提供了各种流类和接口,用以获取不同种类的数…

ELfK logstash filter模块常用的插件 和ELFK部署

ELK之filter模块常用插件 logstash filter模块常用的插件&#xff1a; filter&#xff1a;表示数据处理层&#xff0c;包括对数据进行格式化处理、数据类型转换、数据过滤等&#xff0c;支持正则表达式 grok 对若干个大文本字段进行再分割成一些小字段 (?<字段名…

【算法篇】KMP算法,一种高效的字符串匹配算法

我们今天了解一个字符串匹配算法-KMP算法&#xff0c;内容难度相对来说较高&#xff0c;建议先收藏再细品&#xff01;&#xff01;&#xff01; KMP算法的基本概念 KMP算法是一种高效的字符串匹配算法&#xff0c;由D.E.Knuth&#xff0c;J.H.Morris和V.R.Pratt提出的&#…

LLMs之gptpdf:gptpdf的简介、安装和使用方法、案例应用之详细攻略

LLMs之gptpdf&#xff1a;gptpdf的简介、安装和使用方法、案例应用之详细攻略 目录 gptpdf的简介 1、处理流程 第一步&#xff0c;使用 PyMuPDF 库&#xff0c;对 PDF 进行解析出所有非文本区域&#xff0c;并做好标记&#xff0c;比如: 第二步&#xff0c;使用视觉大模型&…

MySQL安装时initializing database失败

问题页面&#xff1a; 解决方法&#xff1a; 1.勾选红框中的选项&#xff1a; 2.将下图红框中全部改为英文&#xff1a; 然后一路next就可以了。

cs231n作业1——KNN

参考文章&#xff1a;assignment1——KNN KNN 测试时分别计算测试样本和训练集中的每个样本的距离&#xff0c;然后选取距离最近的k个样本的标签信息来进行分类。 方法1&#xff1a;Two Loops for i in range(num_test):for j in range(num_train):dist X[i, :] - self.X…

vue3使用方式汇总

1、引入iconfont阿里图库图标&#xff1a; 1.1 进入阿里图标网站&#xff1a; iconfont阿里&#xff1a;https://www.iconfont.cn/ 1.2 添加图标&#xff1a; 1.3 下载代码&#xff1a; 1.4 在vue3中配置代码&#xff1a; 将其代码复制到src/assets/fonts/目录下&#xff1…

mp4视频太大怎么压缩不影响画质,mp4文件太大怎么变小且清晰度高

在数字化时代&#xff0c;我们常常面临视频文件过大的问题。尤其是mp4格式的视频&#xff0c;文件大小往往令人望而却步。那么&#xff0c;如何在不影响画质的前提下&#xff0c;有效地压缩mp4视频呢&#xff1f;本文将为您揭秘几种简单实用的压缩技巧。 在分享和存储视频时&am…

Open3D 计算点云的欧式距离

目录 一、概述 1.1欧式距离定义 1.2作用和用途 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2处理后点云 一、概述 在Open3D中&#xff0c;compute_point_cloud_distance函数用于计算两个点云之间的距离。具体来说&#xff0c;它计算的是源点云…

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验16 路由信息协议RIP

一、实验目的 1.验证RIP协议的作用&#xff1b; 二、实验要求 1.使用Cisco Packet Tracer仿真平台&#xff1b; 2.观看B站湖科大教书匠仿真实验视频&#xff0c;完成对应实验。 三、实验内容 1.构建网络拓扑&#xff1b; 2.验证RIP协议。 四、实验步骤 1.构建网络拓扑 …

【图像处理】Krita 一款开源免费专业图像处理软件分享

软件介绍 Krita 是一款专业级的图像处理软件&#xff0c;适合数字绘画和创作。它不仅支持栅格图像的细致编辑&#xff0c;还提供了强大的矢量图形工具&#xff0c;使得用户可以在同一个平台上完成多种类型的创作工作。同时具备一定的矢量图形编辑功能。Krita 的首要用途是绘画…

黑马点评商户缓存查询作业——Redis中查询商户类型

记录下自己在gpt帮助下完成的第一个需求~~~ 1. ShopTypeController 2. IShopTypeService 3. ShopTypeServiceImpl&#xff08;模仿ShopServiceImpl来写的&#xff09; 一共分为“1.redis中查询缓存”→“2.判断缓存是否存在&#xff0c;存在直接返回”→“3.缓存不存在则去查数…

2-28 基于matlab提取出频域和时域信号的29个特征

基于matlab提取出频域和时域信号的29个特征&#xff0c;主运行文件feature_extraction&#xff0c;fre_statistical_compute和time_statistical_compute分别提取频域和时域的特征&#xff0c;生成的29个特征保存在生成的feature矩阵中。程序已调通&#xff0c;可直接运行。 2-2…

C语言 printf 函数多种输出格式以及占位输出

一、输出格式 在C语言中&#xff0c;printf 函数提供了多种输出格式&#xff0c;用于控制不同类型数据的输出方式。 1.整数输出格式 %d&#xff1a;以十进制形式输出整数。 %o&#xff1a;以八进制形式输出整数&#xff08;无前导0&#xff09;。 %x 或 %X&#xff1a;以十六进…

EAI四个层次服务-系统架构师(二十六)

1、&#xff08;重点&#xff09;系统应用集成提供了4个不同层次服务&#xff0c;最上层服务是&#xff08;&#xff09;服务。 解析: EAI&#xff08;Enterprise Application Integration&#xff09;系统应用集成&#xff0c;相关概念。 实施EAI必须保证&#xff1a;应用程…

星间链路与星地链路

目录 一、星间链路 1.1 层内星间链路&#xff08;Intra-layer ISLs&#xff09; 1.2 层间星间链路&#xff08;Inter-layer ISLs&#xff09; 1.3 实现方式 1.3.1 微波链路 1.3.2 激光链路 二、星地链路 2.1 星地链路的关键特性 2.1.2 Ka信关站 2.1.2 Q/V信关站 2.1…

JavaScript中,正则表达式所涉及的api,解析、实例和总结

JS中正则的api包括以下&#xff1a; String#searchString#splitString#matchString#replaceRegExp#testRegExp#exec 1. String#search 查找输入串中第一个匹配正则的index&#xff0c;如果没有匹配的则返回-1。g修饰符对结果无影响 var string "abbbcbc"; var r…

谷粒商城学习笔记-使用renren-fast-vue框架时安装依赖包遇到的问题及解决策略

文章目录 1&#xff0c;npm error Class extends value undefined is not a constuctor or null2&#xff0c;npm warn cli npm v10.8.1 does not support Node.js v16.20.2.3&#xff0c;npm error code CERT_HAS_EXPIRED学习心得 这篇文章记录下使用renren-fast-vue&#xff…

QT学习(6)——QT中的定时器事件,两种实现方式;事件的分发event,事件过滤器

目录 引出定时器事件QTimerEventQTimer 事件的分发事件过滤器 总结QT中的鼠标事件定义QLable的鼠标进入离开事件提升为myLabel重写QLabel的函数鼠标的事件鼠标的左中右键枚举鼠标多事件获取和鼠标移动鼠标追踪 QT中的信号和槽自定义信号和槽1.自定义信号2.自定义槽3.建立连接4.…

C++ 类和对象 拷贝构造函数

一 拷贝构造函数的概念&#xff1a; 拷贝构造函数是一种特殊的构造函数&#xff0c;用于创建一个对象是另一个对象的副本。当需要用一个已存在的对象来初始化一个新对象时&#xff0c;或者将对象传递给函数或从函数返回对象时&#xff0c;会调用拷贝构造函数。 二 拷贝构造函…