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()
相关推荐
阿图灵16 分钟前
OpenCV 绘图五件套:画圆、文本、线段、矩形与椭圆
图像处理·人工智能·python·opencv·计算机视觉·绘图
web行路人21 分钟前
AI全栈之旅 · 第一周总结
python
slacker-kian24 分钟前
HuggingFace API加载模型超时:用 ModelScopeAPI 替代
人工智能·python·transformer·huggingface·blip·modelscope·blipprocessor
七夜zippoe1 小时前
DolphinDB 高可用部署实战:从容灾设计到故障自动转移
开发语言·python·高可用·容灾·dolphindb
l1258651 小时前
# LangGraph Deep Research Agent 全流程设计:多轮研究、人机协同与真实来源管理
数据库·人工智能·python·算法·自然语言处理·oracle·langchain
青少儿编程课堂1 小时前
图形化编程实战:智能交通灯调度台,一个作品讲透循环、条件与广播
c++·python·算法·bfs·信息学竞赛
HAPPY酷2 小时前
python的对象和方法
开发语言·python
the局外人2 小时前
别再背 Chain、Agent、Memory 了:用一条“智能流水线”学会 LangChain
python·langchain·llm
Zane19942 小时前
你以为的性能瓶颈,未必是真的瓶颈:用 cProfile 找到真凶
后端·python
铁手飞鹰3 小时前
VSCode Python .embed 嵌入式环境黄色波浪线问题
ide·vscode·python