草庐IT

Python学习三天计划-3

橡皮筋儿 2023-04-16 原文

面向对象

一、类的定义

1.类定义

  • class是关键字,表示要定义类了
  • 类的属性,即定义在类中的变量(成员变量)
  • 类的行为,即定义在类中的函数(成员方法)

2.对象

创建类对象的语法:

class Stu:
	name = None
    age = None
    
student = Stu()

3.变量、方法

class Stu:
	name = None
    age = None
    
    # 注意:在类的方法参数中,要加入self参数,相当于java的this关键字(表示类对象本身)
    def say(self):
        print("hello")

self关键字

self关键字是成员方法定义的时候,必须填写的。

  • 它用来表示类对象自身的意思
  • 当我们使用类对象调用方法的是,self会自动被python传入
  • 在方法内部,想要访问类的成员变量,必须使用self

注意:

传参时可以忽略

class Stu:
    name = None
    age = None

    # 注意:在类的方法参数中,要加入self参数,相当于java的this关键字(表示类对象本身)
    def say(self):
        print("hello")


student = Stu()
# 调用say方法时,不需要传入参数
student.say()

二、类的属性和行为

现实世界的事物也有属性和行为,类也有属性和行为。

使用程序中的类,可以完美的描述现实世界的事物

为什么非要创建对象才能使用呢?

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

这种套路,称之为:面向对象编程

三、类的构造方法

代码中,为对象的属性赋值需要依次进行,略显繁琐。

使用构造方法可以简化赋值操作

描述

Python类可以使用:_init_()方法,称之为构造方法。

可以实现:

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

使用

class Stu:
	name = None
	age = None

	def __init__(self, name, age):
		self.name = name
		self.age = age

	# 注意:在类的方法参数中,要加入self参数,相当于java的this关键字(表示类对象本身)
	def say(self):
		print("hello")

student = Stu("郜宇博",21)
print(student.age)
print(student.name)

注意

不要忘记init前后都有2个下划线

构造方法也是成员方法,不要忘记在参数列表中提供:self

构造方法内定义成员变量,需要使用self关键字

四、魔术方法

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

方法 功能
init 构造方法,可用于创建类对象的时候设置初始化行为
str 用于实现类对象转字符串的行为
lt 用于2个类对象进行小于或大于比较
le 用于2个类对象进行小于等于或大于等于比较
eq 用于2个类对象进行相等比较

1._str_()字符串方法

类似于java的toString()方法

在打印类对象时,将原来的打印内存信息转换为自定义打印格式

class Stu:
	name = None
	age = None

	# 注意:在类的方法参数中,要加入self参数,相当于java的this关键字(表示类对象本身)
	def say(self):
		print("hello")

	def __init__(self, name, age):
		self.name = name
		self.age = age
	def __str__(self):
		return f"姓名:{self.name},年龄:{self.age}"
student = Stu("郜宇博",21)
print(student)

2._lt_()字符串方法

在进行比较时,可以直接使用 > < 符号进行比较(指定比较的数据)

class Stu:
	name = None
	age = None

	def __init__(self, name, age):
		self.name = name
		self.age = age
		
	# Less than的简称
	def __lt__(self, other):
		return self.age < other.age
student_1 = Stu("郜宇博",21)
student_2 = Stu("郜宇博",50)
# 相当于比较年龄的大小
print(student_1 < student_2)

五、封装

面向对象包含3大主要特性:

  • 封装
  • 继承
  • 多态

现实世界中的事物,有属性和行为。

但是不代表这些属性和行为都是开放给用户使用的

既然现实事物有不公开的属性和行为,那么作为现实事物在程序中映射的类,也应该支持。

描述

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

  • 私有成员变量
  • 私有成员方法

在类中定义的私有变量和方法只能类的内部使用

只需要在定义变量、方法名时前面添加两个下划线符号__

class Stu:
	name = None
	age = None
	__gender = '男'

stuent = Stu()
print(stuent.gender)

六、继承

每一款手机都是基于老款的设计图,修修改改

1. 代码

如下代码很复杂,需要引入继承来简化代码

引入继承

如下为多继承

pass关键字

代表不执行,空实现,可以用来构建空类,空方法,抽象方法

2. 多继承

注意

多个父类中,如果有同名的成员,那么默认以继承顺序(从左到右)为优先级。

即:先继承的保留,后继承的被覆盖

3. 复写

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

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

class Stu:
   name = None
   age = None

   def    say(self):
      print("我是学生")

class Man(Stu):
   gender = '男'
   def say(self):
      print("我是男学生")

student = Man()
# 相当于调用Man类重写的say()方法
student.say()

4.调用父类

方式1:使用父类名调用

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

方式2:使用super()调用父类成员

  • 使用成员变量:super().成员变量
  • 使用成员方法:super().成员方法(
class Stu:
	name = None
	age = None

	def	say(self):
		print("我是学生")

class Man(Stu):
	gender = '男'
	def say(self):
		print("我是男学生")
	def student_say(self):
		# 调用了父类的方法,两种方法都可以
		# Stu.say(self)
		super().say()

student = Man()
# 此方法中调用了父类的方法
student.student_say()

七、类型注释

在PyCharm中编写代码,我们经常能够见到如下提示:

因为:PyCharm确定这个对象,是list类型

但是自定义一个函数func,接收一个参数data

PyCharm不会在做出任何提示了

此时使用类型注释就可以帮助编辑器进行代码提示或编写人员的自我提示

注意:

不会真正的对类型做验证和判断。

也就是,类型注解仅仅是提示性的,不是决定性的

1.变量的类型注释

在变量名后加入冒号:和数据类型

from typing import Dict, List
# int类型
var_1: int = 10
# str类型
var_2: str = "adsad"
# list类型
var_3: list = [1, 2, 3]
var_3_1: List[int] = [1, 2, 3]
# dict类型
var_4: dict = {"age": 10, "name": 20}
var_4_1: Dict[str, int] = {"age": 10, "name": 20}


# 类对象
class Student:
    pass

s: Student = Student()

或者使用注释的方法

2.函数

形参的类型注释

def func(data : list):
	pass

表明类型后,就可以对变量进行代码提示了

返回值的类型注释

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

3. Union类型

当列表、字典中数据类型不一致时,需要使用到该函数

Union[类型1,类型2]

from typing import List, Union

var : List[Union[int, str, bool]] = [1, "sss", True]

八、多态

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

抽象类

class AC:
	def cold(self):
		pass
	def hot(self):
		pass

使用

class AC:
   def cold(self):
      pass
   def hot(self):
      pass

class Midea(AC):
   def cold(self):
      print("美的cold")

   def hot(self):
      print("美的hot")

class Gree(AC):
   def cold(self):
      print("格力cold")

   def hot(self):
      print("格力hot")

def to_cold(ac : AC):
   ac.cold()

gree : Gree = Gree()
midea : Midea = Midea()

to_cold(gree) # 输出格力cold

有关Python学习三天计划-3的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  3. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  4. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  5. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  6. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  7. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  8. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  9. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  10. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

随机推荐