day13
笔记来源于:黑马程序员python教程,8天python从入门到精通,学python看这套就够了
目录
- day13
- 97、初识对象
- 98、类的成员方法
- 类的定义和使用
- 成员变量和成员方法
- 成员方法的定义语法
- 99、类和对象
- 在程序中通过类来描述
- 基于类创建对象
- 100、构造方法
- 课后练习
- 101、魔术方法
- \_\_str\_\_字符串方法
- \_\_lt\_\_小于符号比较方法
- \_\_le\_\_ 小于等于比较符号方法
- \_\_eq\_\_,比较运算符实现方法
97、初识对象
使用对象组织数据
-
在程序中设计表格,我们称之为:设计类(class)
class Student:name = None # 记录学生的姓名
-
在程序中打印生产表格,我们称之为:创建对象
# 2.创建一个对象(类比生活中,打印一张登记表) stu_1 = Student()
-
在程序中填写表格,我们称之为:对象属性赋值
# 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)