吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 601|回复: 25
收起左侧

[学习记录] Python中class的学习心得

  [复制链接]
wzscrn 发表于 2024-12-16 09:28

Python中class的学习心得

在学习Python的时候,前面各类知识较为容易,唯独对class这的数据格式迷迷糊糊,这段时间学习了相关内容,给大家分享一下个人学习心得。

class的入门理解

在给出枯燥的基础知识之前,我更想要让大家对class有个基本概念。

场景1

玩游戏时。最开始要对人物初始化,比如人物的性别、技能、属性……

一开始,大家基本都一样,新建玩家时,玩家那么多,一遍又一遍的Ctrl+C配合Ctrl+V太过麻烦。

class就有用武之地了,只需要新建class内含的属性即可,后续可以直接赋值。

批量生产就是不一样。

场景2

大家都经历过考试,都有过分数和排名,也都见过班级成绩排名,他基本上都是这样的:

姓名 语文 数学 英语 物理 化学 总分 排名
王二
张三
李四
钱五

对于谁来说,都得要考这些科目,都会有各科目的分数。

就像老师录入分数一样,他只会使用同一个表头,然后依次输入每位同学的分数。

class也是这样,它的作用就是这个表头

基础语法

class ClassName:
    <statement_1>
    .
    .
    .
    <statement_N>

这其中的<statement_i>有两种,分别是属性方法

属性很好理解,就像你的籍贯一样,你出生后就是跟随一辈子的。只要创建了一个class,这个对象的属性就是初始设置好的。例如:

class MyInfo:
    nation = "中国"

这么一来,无论是谁的nation初始化都会是中国,不会因为变量名不同而有所差异。

此时,我们只需要这么做就赋予了变量中国国籍:

# 实例化类
wzscrn = MyInfo()

# 访问类的属性
print(f"wzscrn的国籍是{wzscrn.nation}。") # 这里可以自行搜索Python中的f-string用法

当然,向精确地方?简单,直接修改就好了。

# 实例化类
wzscrn.nation = "中国江苏"

# 访问类的属性
print(f"wzscrn的所在地是{wzscrn.nation}。")

方法说白了就是类内嵌的函数。

class MyScore:
    Chinese = 0
    Math = 0
    English = 0
    Physics = 0
    Chemistry = 0
    def Total_Score(self):
        return self.Chinese+self.Math+self.English+self.Physics+self.Chemistry

好吧,我猜你想问self是个啥,self不就是自己本身吗?

也就是说,这是函数,如果创建了一个类,那么后续函数的变量要用这个类本身的属性。

就好比说,给你算总分,不能把王二麻子的数学得分算到你的头上吧。

可是程序是笨笨的,必须要有严格的指定。

说到这里,类的语法基本上说完了。

是的,就这两类,就这么简单。

class的简单示例

那么现在我们是班主任了,真得给学生录入分数了。

那么先得创建类。

class ClassScore:
    Chinese = 0
    Math = 0
    English = 0
    Physics = 0
    Chemistry = 0

    def Total_Score(self):
        return self.Chinese+self.Math+self.English+self.Physics+self.Chemistry

好啦,赶快把你们班同学的姓名录进去吧。

wanger = ClassScore()
zhangsan = ClassScore()
lisi = ClassScore()
qianwu = ClassScore()

别停,大家现在都是0分呢,赶快录入分数吧。

wanger.Chinese = 75
wanger.Math = 85
wanger.English = 69
wanger.Physics = 82
wanger.Chemistry = 89
.
.
.

class的高级语法

累吧?就是让你一个个输到不想打字了。毕竟懒人推动世界进步

构造函数(__init__ 方法)

该怎样依次输入姓名和各科成绩就能直接给对象赋值了呢?

这就用用到构造函数__init__

构造函数是在创建对象时自动调用的方法,用于初始化对象的属性。

class Stu_Score:
    def __init__(self, name, chinese, math, english, physics, chemistry):
        self.name = name
        self.chinese = chinese
        self.math = math
        self.english = english
        self.physics = physics
        self.chemistry = chemistry

    def total_score(self):
        return self.chinese + self.math + self.english + self.physics + self.chemistry

# 实例化对象
wanger = Stu_Score("王二", 75, 85, 69, 82, 89)
print(f"{wanger.name}的总分是{wanger.total_score()}")

这下是不是非常简单了?只需要输入这几个分数即可,不需要再像上面挨个输入属性赋值啦。

2. 继承

继承是面向对象编程的一个核心概念,它允许我们创建一个新的类(称为子类)来继承一个或多个现有类(称为父类或基类)的属性和方法。

class Person:
    def __init__(self, name):
        self.name = name

    def greet(self):
        return f"Hello, my name is {self.name}."

class Student(Person):
    def __init__(self, name, chinese, math, english, physics, chemistry):
        super().__init__(name)  # 调用父类的构造函数
        self.chinese = chinese
        self.math = math
        self.english = english
        self.physics = physics
        self.chemistry = chemistry

    def total_score(self):
        return self.chinese + self.math + self.english + self.physics + self.chemistry

# 实例化对象
wanger = Student("王二", 75, 85, 69, 82, 89)
print(wanger.greet())
print(f"{wanger.name}的总分是{wanger.total_score()}")

3. 多态

多态允许你将子类对象用作父类对象,从而实现接口的多种不同表现形式。在Python中,由于鸭子类型(duck typing)的存在,多态性天然得到支持。

例如,现在要来编写模拟动物发声的程序,你需要先设定动物属性,然后再具体指定某一动物的叫声。

class Animal:
    def speak_sound(self):
        raise NotImplementedError("未指定具体动物")

class Dog(Animal):
    def speak_sound(self):
        return "汪汪汪"

class Cat(Animal):
    def speak_sound(self):
        return "喵喵喵"

# 多态性
animals = [Dog(), Cat()]
for animal in animals:
    print(animal.speak())

4. 封装

封装是将数据和操作数据的函数绑定在一起,形成一个不可分割的整体。通过访问控制(如私有属性),你可以限制对对象属性的直接访问。

class Student:
    def __init__(self, name, chinese, math, english, physics, chemistry):
        self.__name = name
        self.chinese = chinese
        self.math = math
        self.english = english
        self.physics = physics
        self.chemistry = chemistry

    @property
    def name(self):
        return self.__name

    def total_score(self):
        return self.chinese + self.math + self.english + self.physics + self.chemistry

# 实例化对象
wanger = Student("王二", 75, 85, 69, 82, 89)
print(wanger.name)  # 访问私有属性通过@property装饰器
# print(wanger.__name)  # 这将引发AttributeError,因为__name是私有属性

完整示例:学生成绩管理系统

下面是一个综合示例,展示如何使用类、构造函数、继承、多态和封装来创建一个简单的学生成绩管理系统。

class Person:
    def __init__(self, name):
        self.__name = name

    def name(self):
        return self.__name

class Student(Person):
    def __init__(self, name, chinese, math, english, physics, chemistry):
        super().__init__(name)
        self.chinese = chinese
        self.math = math
        self.english = english
        self.physics = physics
        self.chemistry = chemistry

    def total_score(self):
        return self.chinese + self.math + self.english + self.physics + self.chemistry

    def __str__(self):
        return f"{self.name()}:语文{self.chinese}分,数学{self.math}分,英语{self.english}分,物理{self.physics}分,化学{self.chemistry}分,共计{self.total_score()}分"

# 创建一个学生列表
students = [
    Student("王二", 75, 85, 69, 82, 89),
    Student("张三", 88, 76, 90, 84, 81),
    Student("李四", 92, 88, 77, 91, 85),
    Student("钱五", 85, 93, 84, 96, 98)
]

# 打印学生信息
for student in students:
    print(student)

点餐系统的示例

编写一个选零食系统,各个零食相关的资料如下:

Popcorn Ice Cream Chocolate Pretzels Chips Candy Cookies Cola Soda
Taste 9 9 8 8 7 7 7 6 6
Price 6 6 4 4 5.5 2 4 3.5 3.5

请编写一个可以根据预算分别依据Taste、Price和Taste-to-Price ratio给出零食选择建议。

代码如下:

class Snack(object):
    def __init__(self, n, v, w):
        self.name = n
        self.taste = v
        self.price = w

    def getTaste(self):
        return self.taste

    def getPrice(self):
        return self.price

    def density(self):
        return self.taste / self.price

def buildMenu(names, tastes, prices):
    menu = []
    for i in range(len(names)):
        menu.append(Snack(names[i], tastes[i], prices[i]))
    return menu

def greedy(items, maxPrice, keyFunction):
    itemsCopy = sorted(items, key=keyFunction, reverse=True)
    result = []
    totalTaste = 0
    totalPrice = 0

    for i in range(len(itemsCopy)):
        if (totalPrice + itemsCopy[i].getPrice()) <= maxPrice:
            result.append(itemsCopy[i])
            totalTaste += itemsCopy[i].getTaste()
            totalPrice += itemsCopy[i].getPrice()
    return result, totalTaste, totalPrice

def testGreedys(snacks, maxPrice):
    print('\nSelection based on taste score: ')
    result, totalTaste, totalPrice = greedy(snacks, maxPrice, keyFunction=lambda x: x.getTaste())
    print('Total taste scores: {:.1f}, total cost: $ {:.1f}'.format(totalTaste, totalPrice))
    for s in result:
        print(f" {s.name}: <{s.taste},{s.price}>")

    print('\nSelection based on price: ')
    result, totalTaste, totalPrice = greedy(snacks, maxPrice, keyFunction=lambda x: - x.getPrice())
    print('Total taste scores: {:.1f}, total cost: $ {:.1f}'.format(totalTaste, totalPrice))
    for s in result:
        print(f" {s.name}: <{s.taste},{s.price}>")

    print('\nSelection based on taste-to-price ratio: ')
    result, totalTaste, totalPrice = greedy(snacks, maxPrice, keyFunction=lambda x: x.density())
    print('Total taste scores: {:.1f}, total cost: $ {:.1f}'.format(totalTaste, totalPrice))
    for s in result:
        print(f" {s.name}: <{s.taste},{s.price}>")

snacks = buildMenu(['Popcorn', 'Ice Cream', 'Chocolate', 'Pretzels', 'Chips', 'Candy', 'Cookies', 'Cola', 'Soda'], [9, 9, 8, 8, 7, 7, 7, 6, 6], [6, 6, 4, 4, 5.5, 2, 4, 3.5, 5.5])

maxPrice = eval(input("Enter the total budget($): "))
testGreedys(snacks, maxPrice)

免费评分

参与人数 8吾爱币 +14 热心值 +4 收起 理由
紫气 + 1 + 1 谢谢@Thanks!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
wapjsx + 1 + 1 谢谢,这思路感觉很不错!学习了~~~
轩辕不负卿 + 1 我很赞同!
EricaY + 1 我很赞同!
四君子 + 1 我很赞同!
wansir + 1 + 1 热心回复!
UDB555 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

massle 发表于 2024-12-16 09:47
感谢分享,python的class跟java的class类似,要是有java基础学习python会容易一些。
 楼主| wzscrn 发表于 2024-12-16 10:10
massle 发表于 2024-12-16 09:47
感谢分享,python的class跟java的class类似,要是有java基础学习python会容易一些。

谢谢分享。后面找时间看看java
yanyaneboy 发表于 2024-12-16 10:13
hbu126 发表于 2024-12-16 10:14
学习一下
tnancy2kk 发表于 2024-12-16 11:03
太棒了,感谢分享!
pyjiujiu 发表于 2024-12-16 11:59
这是个很好的起点
补充点,单纯为了复用变量 函数,数据结构一大堆都可以承担,class 更多是 对global 命名域的补充,要的是方便管理
其次更深的来说,基于 fluent python 这本书的说法,oop 是面向 interface的
pomxion 发表于 2024-12-16 12:08
最近在学习这方面的知识,先谢谢分享  研究一下下
pomxion 发表于 2024-12-16 12:20
最近在学习这方面的知识,先谢谢分享  研究一下下
lixiangliuyi 发表于 2024-12-16 12:25
__init__,,
别写错。init其实就是初始化的意思。新建变量+赋值。。毕竟人生苦短嘛。。。简洁优雅,
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-2 20:25

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表