您的位置:首页 > 新闻 > 资讯 > Python学习打卡:day13

Python学习打卡:day13

2024/10/11 3:21:56 来源:https://blog.csdn.net/qq_45545681/article/details/139889107  浏览:    关键词:Python学习打卡:day13

day13

笔记来源于:黑马程序员python教程,8天python从入门到精通,学python看这套就够了

目录

  • day13
    • 97、初识对象
    • 98、类的成员方法
      • 类的定义和使用
      • 成员变量和成员方法
      • 成员方法的定义语法
    • 99、类和对象
      • 在程序中通过类来描述
      • 基于类创建对象
    • 100、构造方法
      • 课后练习
    • 101、魔术方法
      • \_\_str\_\_字符串方法
      • \_\_lt\_\_小于符号比较方法
      • \_\_le\_\_ 小于等于比较符号方法
      • \_\_eq\_\_,比较运算符实现方法

97、初识对象

使用对象组织数据

  1. 在程序中设计表格,我们称之为:设计类(class)

    class   Student:name = None         # 记录学生的姓名
    
  2. 在程序中打印生产表格,我们称之为:创建对象

    # 2.创建一个对象(类比生活中,打印一张登记表)
    stu_1 = Student()
    
  3. 在程序中填写表格,我们称之为:对象属性赋值

    # 3.对象属性进行赋值(类比生活中:填写表单)
    stu_1.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 = 31# 4.获取对象中的记录信息
print(stu_1.name)
print(stu_1.gender)
print(stu_1.nationality)
print(stu_1.native_place)
print(stu_1.age)

98、类的成员方法

类的定义和使用

类的使用语法:
在这里插入图片描述

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

创建类对象的语法:

在这里插入图片描述

在这里插入图片描述

成员变量和成员方法

class Student:name = None         # 记录学生的姓名def say_hi(self):print(f"hello everyone, my name is {self.name}")stu_1 = Student()
stu_1.name = "zhoujielun"
stu_1.say_hi()

可以看出,类中:

  • 不仅可以定义属性用来记录数据
  • 也可以定义函数,用来记录行为

其中:

  • 类中定义的属性(变量),我们称之为:成员变量
  • 类中定义的行为(函数),我们称之为:成员方法

成员方法的定义语法

在类中定义成员方法和定义函数基本一致,但仍有细微区别:
在这里插入图片描述

可以看到,在方法定义的参数列表中,有一个:self 关键字

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

  • 它用来表示类对象自身的意思;
  • 当我们使用类对象调用方法的是,self 会自动被 python 传入;
  • 在方法内部,想要访问类的成员变量,必须使用 self
def say_hi(self):print(f"hello everyone, my name is {self.name}")

tips

self 关键字,尽管在参数列表中,但是传参的时候可以忽略它。

如:
在这里插入图片描述

可以看到,在传入参数的时候,self 是透明的,可以不用理会它。

示例代码:

"""
演示面向对象类中的成员方法定义和使用
"""# 定义一个带有成员方法的类
class Student:name = None         # 记录学生的姓名def say_hi(self):print(f"hello everyone, my name is {self.name}")def say_hi_2(self, msg):print(f"hello everyone, my name is {self.name}, {msg}")stu_1 = Student()
stu_1.name = "zhoujielun"
stu_1.say_hi()
stu_1.say_hi_2("哎呦不错哦")stu_2 = Student()
stu_2.name = "linjunjie"
stu_2.say_hi()
stu_2.say_hi_2("小伙子我看好你")

99、类和对象

基于类创建对象的语法:对象名 = 类名称()

类只是一种程序内的“设计图纸”,需要基于图纸生产实体(对象),才能正常工作,这种套路,称之为:面向对象编程。

在程序中通过类来描述

在这里插入图片描述

基于类创建对象

在这里插入图片描述

这就是面向对象编程:设计类,基于类创建对象,由对象做具体的工作

示例代码:

"""
演示类和对象的关系:即面向对象的编程套路(思想)
"""
import sys# 设计一个闹钟类
class Clock:id = None       # 序列化price = None    # 价格def ring(self):if sys.platform.startswith('win'):import winsoundwinsound.Beep(1000, 1000)  # 频率和持续时间(毫秒)else:from playsound import playsoundplaysound('/mnt/hgfs/Win_Ubuntu_Share/sound.mp3')  # 替换为你的声音文件路径# 构建 2 个闹钟对象并让其工作
clock1 = Clock()
clock1.id = "003032"
clock1.price = 19.99
print(f"闹钟ID:{clock1.id}, 价格:{clock1.price}")
clock1.ring()clock2 = Clock()
clock2.id = "003033"
clock2.price = 21.99
print(f"闹钟ID:{clock2.id}, 价格:{clock2.price}")
clock2.ring()

100、构造方法

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

可以实现:

  • 在创建类对象(构造类)的时候,会自动执行
  • 在创建类对象(构造类)的时候,将传入参数自动传递给__init__方法使用
演示类的构造方法
"""
# 演示使用构造方法对成员变量进行赋值
# 构造方法的名称: __init__class Student:name = Noneage = Nonetel = Nonedef __init__(self, name, age, tel):self.name = nameself.age = ageself.tel = telprint("Student类创建了一个类对象")stu = Student("周杰伦", 31, "18500006666")
print(stu.name)
print(stu.age)
print(stu.tel )

tips

  • 重要的事情说三遍,构造方法名称:__init__ 、__init__、__init__ , 千万不要忘记 init 前后都有2个下划线
  • 构造方法也是成员方法,不要忘记在参数列表中提供:self
  • 在构造方法内定义成员变量,需要 使用self 关键字
def __init__(self, name, age, tel):self.name = nameself.age = ageself.tel = telprint("Student类创建了一个类对象")

课后练习

在这里插入图片描述

示例程序:

class Student:name = Noneage = Noneaddress = Nonedef __init__(self, name, age, address):self.name = nameself.age = ageself.address = addressmy_list = []
# stu = Student()for element in range(1, 4):print(f"当前录入第{element}位学生信息,总共需要录入3位同学信息")name = input("请输入学生的姓名:")age = input("请输入学生的年龄:")address = input("请输入学生的地址:")stu = Student(name, age, address)my_list.append((stu.name, stu.age, stu.address))print(f"学生{element}信息录入完成,信息为:【学生姓名:{stu.name}, 年龄:{stu.age}, 地址:{stu.address}】")print(f"所有信息为:{my_list}")# 结果
当前录入第1位学生信息,总共需要录入3位同学信息
请输入学生的姓名:jack
请输入学生的年龄:22
请输入学生的地址:shanghai
学生1信息录入完成,信息为:【学生姓名:jack, 年龄:22, 地址:shanghai】
当前录入第2位学生信息,总共需要录入3位同学信息
请输入学生的姓名:rose
请输入学生的年龄:23
请输入学生的地址:bejing
学生2信息录入完成,信息为:【学生姓名:rose, 年龄:23, 地址:bejing】
当前录入第3位学生信息,总共需要录入3位同学信息
请输入学生的姓名:麦克
请输入学生的年龄:24
请输入学生的地址:南京
学生3信息录入完成,信息为:【学生姓名:麦克, 年龄:24, 地址:南京】
所有信息为:[('jack', '22', 'shanghai'), ('rose', '23', 'bejing'), ('麦克', '24', '南京')]

101、魔术方法

内置的类方法,各自有各自特殊的功能,这些内置方法我们称之为:魔术方法
在这里插入图片描述

__str__字符串方法

  • 方法名:****str
  • 返回值:字符串
  • 内容:自行定义
class Student:def __init__(self, name, age):self.name = nameself.age = age# __str__魔术方法def __str__(self):return f"Student类对象, name:{self.name}, age:{self.age}"stu1 = Student("周杰伦", 31)
stu2 = Student("林俊杰", 36)
print(stu)
print(str(stu))# 结果
Student类对象, name:周杰伦, age:31
Student类对象, name:周杰伦, age:31

未定义 __str__ 魔术方法时,当类对象需要被转换为字符串之时,会输出如下结果(内存地址):

<__main__.Student object at 0x7f288b7220a0>
<__main__.Student object at 0x7f288b7220a0>

内存地址没有多大作用,我们可以通过__str__方法,控制类转换为字符串的行为。

__lt__小于符号比较方法

直接对2个对象进行比较是不可以的,但是在类中实现 __lt__ 方法,即可同时完成:小于符号 和 大于符号 2种比较。

  • 方法名:****lt
  • 传入参数:other,另一个类对象
  • **返回值:**True False
  • 内容:自行定义

示例代码:

class Student:def __init__(self, name, age):self.name = nameself.age = age# __str__魔术方法def __str__(self):return f"Student类对象, name:{self.name}, age:{self.age}"# __lt__魔术方法def __lt__(self, other):return self.age < other.age# __le__魔术方法def __le__(self, other):return self.age <= other.age# __eq__魔术方法def __eq__(self, other):return self.age == other.agestu = Student("周杰伦", 31)
stu2 = Student("林俊杰", 36)
print(stu1 < stu2)

__le__ 小于等于比较符号方法

魔术方法:__le__可用于:<=、>=两种比较运算符上。

  • 方法名:__le__
  • 传入参数:other,另一个类对象
  • 返回值:True 或False
  • 内容:自行定义
class Student:def __init__(self, name, age):self.name = nameself.age = age# __str__魔术方法def __str__(self):return f"Student类对象, name:{self.name}, age:{self.age}"# __lt__魔术方法def __lt__(self, other):return self.age < other.age# __le__魔术方法def __le__(self, other):return self.age <= other.age# __eq__魔术方法def __eq__(self, other):return self.age == other.agestu = Student("周杰伦", 31)
stu2 = Student("林俊杰", 36)
print(stu1 >= stu2)

__eq__,比较运算符实现方法

不实现__eq__方法,对象之间可以比较,但是是比较内存地址,也即是:不同对象==比较一定是False结果。

实现了__eq__方法,就可以按照自己的想法来决定2个对象是否相等了。

class Student:def __init__(self, name, age):self.name = nameself.age = age# __str__魔术方法def __str__(self):return f"Student类对象, name:{self.name}, age:{self.age}"# __lt__魔术方法def __lt__(self, other):return self.age < other.age# __le__魔术方法def __le__(self, other):return self.age <= other.age# __eq__魔术方法def __eq__(self, other):return self.age == other.agestu = Student("周杰伦", 31)
stu2 = Student("林俊杰", 36)
print(stu1 == stu2)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com