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()
相关推荐
小玮看世界2 小时前
[Python]从“脏”数据到优雅实现:一个IoT滑动窗口最大值问题的测试驱动优化实录
linux·前端·python
MC皮蛋侠客3 小时前
SQLAlchemy 系列(十一):从 1.x 到 2.x——渐进迁移与数据访问层治理
数据库·python
魔镜前的帅比3 小时前
(开源项目)x-claw (设计)
python·ai·rust·开源
谢尔登4 小时前
分享一些我常用的Skill
java·人工智能·python·actionscript
k4m7v2pz4 小时前
macOS 解压 40GB 分卷+中文密码固件镜像的五个深坑与解决方案
python·7-zip·aes加密·踩坑记录·r36s·多卷zip解压
小白学大数据4 小时前
Python 爬虫实战:抓取汽车之家二手车成交价格与里程数据
开发语言·爬虫·python·汽车
Jazz_z5 小时前
如何用Python将彩色PDF一键转为黑白(灰度)
java·python·pdf
SEO_juper5 小时前
2026年Schema自动注入实战:用Python批量给1000个页面加上JSON-LD,AI引用率实测提升38%
人工智能·python·json·seo·独立站
zzzll11115 小时前
HashMap、HashTable、ConcurrentHashMap 详细区别与深度解析
开发语言·python