10.Python class类的定义和魔术方法

1.面向对象思想

现实世界的事物和类

2.定义

python 复制代码
"""
演示类和对象的关系,即面向对象的编程套路(思想)
"""

# 设计一个闹钟类 class  类名 class是关键字,表示要定义类了
class Clock:
    #类的属性,即定义在类中的变量(成员变量)
    id = None       # 序列化
    price = None    # 价格


    def ring(self): # 类的行为,即定义在类中的函数(成员方法)
        import winsound
        winsound.Beep(2000, 3000) # 播放声音 

# 构建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()

在类中定义成员方法和定义函数基本一致,但仍有细微区别:

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

  • 它用来表示类对象自身的意思
  • 当我们使用类对象调用方法的是,self会自动被python传入
  • 在方法内部,想要访问类的成员变量,必须使用self
python 复制代码
def 方法名(self,形参1,....,形参N):
    方法体

3.__init__ (前后都有2个下划线)构造方法

  • 在创建类对象(构造类)的时候,会自动执行。
  • 在创建类对象(构造类)的时候,将传入参数自动传递给__init__方法使用。
python 复制代码
"""
演示类的构造方法
"""
# 演示使用构造方法对成员变量进行赋值
# 构造方法的名称:__init__

class Student:
    #这里可以省略
    # name=None
    # age=None
    # tel=None

    # 在构造方法内定义成员变量,需要使用self关键字
    # 这是因为:变量是定义在构造方法内部,如果要成为成员变量,需要用self来表示。
    def __init__(self, name, age ,tel):
        self.name = name
        self.age = age
        self.tel = tel
        print("Student类创建了一个类对象")

stu = Student("周杰轮", 31, "18500006666")
print(stu.name)
print(stu.age)
print(stu.tel)

A.练习

通过for循环,配合input输入语句,并使用构造方法,完成学生信息的键盘录入

输入完成后,使用print语句,完成信息的输出

python 复制代码
class Student:
    def __init__(self,name,age,addr):
        self.name=name
        self.age=age
        self.addr=addr

    def print_info(self,l):
        print(f"学生{l}信息录入完成,信息为:【学生姓名:{self.name},年龄:{self.age},地址:{self.addr}】")
        print("----------------------------")



print("欢迎来到学生信息录入系统")
num=0
list_stu=[]
while True:
    n = input("请输入学生姓名:")
    a = input("请输入学生年龄:")
    d = input("请输入学生地址:")
    s = Student(n, a, d)
    num += 1
    s.print_info(num)
    list_stu.append(s)

    if num == 3:
        print(f"已达到最大录入人数(3人),系统自动退出。")
        # for循环实现 并取出下标
        # 替代 for i in range(len(list_stu)):
        for i, stu in enumerate(list_stu):
            stu.print_info(i + 1)  # i 从 0 开始,所以加 1

        list_stu.clear()
        break

4.其它魔术方法

方法 功能
__init__ 构造方法,可用于创建类对象的时候设置初始化行为
__str__ 用于实现类对象转字符串的行为
__lt__ 用于2个类对象进行小于或大于比较
__le__ 用于2个类对象进行小于等于或大于等于比较
__eq__ 用于2个类对象进行相等比较
python 复制代码
class Student:
    def __init__(self,name,age,addr):
        self.name=name
        self.age=age
        self.addr=addr

    # 如果不定义__str__()方法,则打印对象时,打印的是对象内存地址
    # 定义__str__()方法后,打印对象时,打印的是对象中定义的__str__()方法返回的字符串
    def __str__(self):
        return f"【学生姓名:{self.name},年龄:{self.age},地址:{self.addr}】"
    # 定义__lt__()方法,实现比较按照年龄比较大小
    # 例如:s1=Student("张三",18,"上海") s2=Student("李四",19,"北京")  print(s1<s2) 直接比较对象 返回 True
    def __lt__(self, other):
        return self.age < other.age
    # 添加__eq__()方法,实现比较按照年龄比较大小
    # 例如:s1=Student("张三",18,"上海") s2=Student("李四",18,"北京")  print(s1==s2) 直接比较对象 返回True
    def __eq__(self, other):
        return self.age == other.age

    # 添加__le__()方法,<=、>=两种比较运算符上
    def __len__(self,other):
        return self.age <= other.age

定义私有成员变量和私有成员方法

python 复制代码
"""
讲解面向对象-封装特性
设计带有私有成员的手机
"""

# 设计一个类,用来描述手机
class Phone:
   # 提供私有成员变量:__is_5g_enable
   __is_5g_enable = True      # 5g状态


   # 提供私有成员方法:__check_5g()
   def __check_5g(self):
       if self.__is_5g_enable:
           print("5g开启")
       else:
           print("5g关闭,使用4g网络")

   # 提供公开成员方法:call_by_5g()
   def call_by_5g(self):
       self.__check_5g()
       print("正在通话中")


phone = Phone()
# phone.__is_5g_enable 直接访问报错 必须通过公开成员方法访问
phone.call_by_5g()
相关推荐
aramae11 分钟前
Python 使用库:标准库与第三方库实战
服务器·开发语言·windows·python
IamZJT_11 分钟前
Agent 系统工程 01|模型之外,Harness 到底该负责什么?
人工智能·python·程序员
沧海一笑-dj11 分钟前
【Python】Python学习笔记-Python 核心基础
人工智能·python·ai·解释型语言
用户768553412553819 分钟前
Python 并发怎么选?一篇讲清 threading、multiprocessing、asyncio 的边界
python
梦想不只是梦与想35 分钟前
环境管理系统:Conda(一)
python·conda·环境隔离
计算机源码社1 小时前
基于K-Means聚类的新生儿败血症临床分型与可视化分析系统 基于数据挖掘的新生儿败血症生命体征时序走势与关联性可视化研究
大数据·hadoop·python·数据挖掘·数据分析·spark·毕业设计
一阵寒风1 小时前
用 AI 把PCB制前工程CAM无人值守输出系统做出来
python·ai编程·pcb工艺
SamChan901 小时前
Python 处理小语种 PDF 的编码坑:重音字符、连字与 (cid:xx) 乱码的解决方案
python·ai·pdf·机器翻译
量化吞吐机2 小时前
会写代码之后,量化学习还要补上交易判断
人工智能·python
lie..2 小时前
30天从零开始学AI应用开发(Day 1):机器学习、深度学习、大模型,到底是个啥关系
人工智能·python·大模型