34、Python面向对象编程:实例操作与应用

Python面向对象编程:实例操作与应用

1. __str__ 方法的使用

在Python中, __str__ 方法是一个特殊的方法,当对象被传递给 print 函数或内置的 str 函数时,会自动调用该方法。例如,在银行账户的示例中,当将账户对象传递给 print 函数时,会调用 BankAccount 类的 __str__ 方法,并显示该方法返回的字符串。

account = bankaccount2.BankAccount(1500.0)
message = str(account)
print(message)

在上述代码中, str(account) 调用了 BankAccount 类的 __str__ 方法,并将返回的字符串赋值给 message 变量,最后通过 print 函数显示出来。

2. 类的实例操作

每个类的实例都有自己的一组数据属性,这些属性属于特定的对象实例,被称为实例属性。可以在一个程序中创建同一个类的多个实例,每个实例都有自己独立的属性。

2.1 创建多个 Coin 类实例

以下是一个创建三个 Coin 类实例的示例代码:

import coin

def main():
    coin1 = coin.Coin()
    coin2 = coin.Coin()
    coin3 = coin.Coin()

    print('I have three coins with these sides up:')
    print(coin1.get_sideup())
    print(coin2.get_sideup())
    print(coin3.get_sideup())
    print()

    print('I am tossing all three coins ...')
    print()
    coin1.toss()
    coin2.toss()
    coin3.toss()

    print('Now here are the sides that are up:')
    print(coin1.get_sideup())
    print(coin2.get_sideup())
    print(coin3.get_sideup())
    print()

main()

在这个示例中,创建了三个 Coin 类的实例 coin1 coin2 coin3 ,每个实例都有自己的 __sideup 属性。通过调用 toss 方法,可以改变每个硬币的正反面状态。

2.2 创建 CellPhone

下面是一个创建 CellPhone 类的示例,该类用于表示手机的信息:

class CellPhone:
    def __init__(self, manufact, model, price):
        self.__manufact = manufact
        self.__model = model
        self.__retail_price = price

    def set_manufact(self, manufact):
        self.__manufact = manufact

    def set_model(self, model):
        self.__model = model

    def set_retail_price(self, price):
        self.__retail_price = price

    def get_manufact(self):
        return self.__manufact

    def get_model(self):
        return self.__model

    def get_retail_price(self):
        return self.__retail_price

这个类包含了手机的制造商、型号和零售价格等属性,以及相应的访问器和修改器方法。

3. 访问器和修改器方法

为了确保对象对其属性的控制,通常将类的所有数据属性设置为私有,并提供公共方法来访问和修改这些属性。

  • 访问器方法(Accessor Methods) :返回类属性的值,但不改变属性的值。例如, CellPhone 类中的 get_manufact get_model get_retail_price 方法。
  • 修改器方法(Mutator Methods) :存储或改变类属性的值。例如, CellPhone 类中的 set_manufact set_model set_retail_price 方法。
4. 将对象存储在列表中

可以将对象存储在列表中,以便对多个对象进行管理。以下是一个将 CellPhone 对象存储在列表中的示例:

import cellphone

def main():
    phones = make_list()
    print('Here is the data you entered:')
    display_list(phones)

def make_list():
    phone_list = []
    print('Enter data for five phones.')
    for count in range(1, 6):
        print('Phone number ' + str(count) + ':')
        man = input('Enter the manufacturer: ')
        mod = input('Enter the model number: ')
        retail = float(input('Enter the retail price: '))
        print()

        phone = cellphone.CellPhone(man, mod, retail)
        phone_list.append(phone)

    return phone_list

def display_list(phone_list):
    for item in phone_list:
        print(item.get_manufact())
        print(item.get_model())
        print(item.get_retail_price())
        print()

main()

在上述代码中, make_list 函数从用户那里获取五个手机的信息,并创建相应的 CellPhone 对象,将这些对象存储在列表中。 display_list 函数则用于显示列表中每个对象的属性。

5. 传递对象作为参数

在开发处理对象的应用程序时,经常需要编写接受对象作为参数的函数和方法。例如,以下是一个接受 Coin 对象作为参数的函数:

def show_coin_status(coin_obj):
    print('This side of the coin is up:', coin_obj.get_sideup())

my_coin = coin.Coin()
show_coin_status(my_coin)

在上述代码中, show_coin_status 函数接受一个 Coin 对象作为参数,并显示该硬币当前朝上的一面。

6. 对象的序列化和反序列化

可以使用 pickle 模块对对象进行序列化和反序列化操作,将对象保存到文件中,以便后续检索。

6.1 序列化对象

以下是一个将 CellPhone 对象序列化并保存到文件中的示例:

import pickle
import cellphone

FILENAME = 'cellphones.dat'

def main():
    again = 'y'
    output_file = open(FILENAME, 'wb')

    while again.lower() == 'y':
        man = input('Enter the manufacturer: ')
        mod = input('Enter the model number: ')
        retail = float(input('Enter the retail price: '))

        phone = cellphone.CellPhone(man, mod, retail)
        pickle.dump(phone, output_file)

        again = input('Enter more phone data? (y/n): ')

    output_file.close()
    print('The data was written to', FILENAME)

main()
6.2 反序列化对象

以下是一个从文件中反序列化 CellPhone 对象的示例:

import pickle
import cellphone

FILENAME = 'cellphones.dat'

def main():
    end_of_file = False
    input_file = open(FILENAME, 'rb')

    while not end_of_file:
        try:
            phone = pickle.load(input_file)
            display_data(phone)
        except EOFError:
            end_of_file = True

    input_file.close()

def display_data(phone):
    print('Manufacturer:', phone.get_manufact())
    print('Model Number:', phone.get_model())
    print('Retail Price: $', format(phone.get_retail_price(), ',.2f'), sep='')
    print()

main()
7. 将对象存储在字典中

字典也可以用于存储自定义类的对象,每个对象作为字典的值,使用特定的键来检索对象。

7.1 创建 Contact

以下是一个创建 Contact 类的示例,该类用于存储联系人信息:

class Contact:
    def __init__(self, name, phone, email):
        self.__name = name
        self.__phone = phone
        self.__email = email

    def set_name(self, name):
        self.__name = name

    def set_phone(self, phone):
        self.__phone = phone

    def set_email(self, email):
        self.__email = email

    def get_name(self):
        return self.__name

    def get_phone(self):
        return self.__phone

    def get_email(self):
        return self.__email

    def __str__(self):
        return "Name: " + self.__name + \
               "\nPhone: " + self.__phone + \
               "\nEmail: " + self.__email
7.2 管理联系人信息的程序

以下是一个管理联系人信息的程序示例,该程序使用字典存储 Contact 对象,并提供了查找、添加、修改和删除联系人的功能:

import contact
import pickle

LOOK_UP = 1
ADD = 2
CHANGE = 3
DELETE = 4
QUIT = 5
FILENAME = 'contacts.dat'

def main():
    mycontacts = load_contacts()
    choice = 0

    while choice != QUIT:
        choice = get_menu_choice()

        if choice == LOOK_UP:
            look_up(mycontacts)
        elif choice == ADD:
            add(mycontacts)
        elif choice == CHANGE:
            change(mycontacts)
        elif choice == DELETE:
            delete(mycontacts)

    save_contacts(mycontacts)

def load_contacts():
    try:
        input_file = open(FILENAME, 'rb')
        contact_dct = pickle.load(input_file)
        input_file.close()
    except IOError:
        contact_dct = {}

    return contact_dct

def get_menu_choice():
    print()
    print('Menu')
    print('---------------------------')
    print('1. Look up a contact')
    print('2. Add a new contact')
    print('3. Change an existing contact')
    print('4. Delete a contact')
    print('5. Quit the program')
    print()

    choice = int(input('Enter your choice: '))

    while choice < LOOK_UP or choice > QUIT:
        choice = int(input('Enter a valid choice: '))

    return choice

def look_up(mycontacts):
    name = input('Enter a name: ')
    print(mycontacts.get(name, 'That name is not found.'))

def add(mycontacts):
    name = input('Name: ')
    phone = input('Phone: ')
    email = input('Email: ')

    entry = contact.Contact(name, phone, email)

    if name not in mycontacts:
        mycontacts[name] = entry
        print('The entry has been added.')
    else:
        print('That name already exists.')

def change(mycontacts):
    name = input('Enter a name: ')

    if name in mycontacts:
        phone = input('Enter the new phone number: ')
        email = input('Enter the new email address: ')

        entry = contact.Contact(name, phone, email)
        mycontacts[name] = entry
        print('Information updated.')
    else:
        print('That name is not found.')

def delete(mycontacts):
    name = input('Enter a name: ')

    if name in mycontacts:
        del mycontacts[name]
        print('Entry deleted.')
    else:
        print('That name is not found.')

def save_contacts(mycontacts):
    output_file = open(FILENAME, 'wb')
    pickle.dump(mycontacts, output_file)
    output_file.close()

main()

总结

通过以上示例,我们学习了Python中类的实例操作、对象的存储和传递、对象的序列化和反序列化,以及如何将对象存储在字典中进行管理。这些技术在开发复杂的应用程序时非常有用,可以帮助我们更好地组织和管理数据。

流程图

graph TD;
    A[开始] --> B[加载联系人字典];
    B --> C{选择操作};
    C -- 查找 --> D[查找联系人];
    C -- 添加 --> E[添加联系人];
    C -- 修改 --> F[修改联系人信息];
    C -- 删除 --> G[删除联系人];
    C -- 退出 --> H[保存联系人字典并退出];
    D --> C;
    E --> C;
    F --> C;
    G --> C;

表格

操作 功能
查找 根据姓名查找联系人信息
添加 添加新的联系人信息
修改 修改现有联系人的信息
删除 删除指定姓名的联系人信息
退出 保存联系人字典并退出程序

Python面向对象编程:实例操作与应用

8. 各部分代码功能总结

为了更清晰地理解上述代码的整体结构和各部分的功能,下面以表格形式进行总结:
| 代码模块 | 功能描述 |
| ---- | ---- |
| __str__ 方法使用 | 当对象传递给 print str 函数时,自动调用该方法返回字符串 |
| 创建多个 Coin 类实例 | 创建多个 Coin 对象,每个对象有独立的 __sideup 属性,可调用 toss 方法改变状态 |
| 创建 CellPhone 类 | 表示手机信息,包含制造商、型号、零售价格属性,以及访问器和修改器方法 |
| 访问器和修改器方法 | 访问器返回属性值不改变,修改器存储或改变属性值 |
| 将对象存储在列表中 | 创建多个 CellPhone 对象并存储在列表中,方便管理和显示 |
| 传递对象作为参数 | 编写接受对象作为参数的函数和方法,对对象进行操作 |
| 对象的序列化和反序列化 | 使用 pickle 模块将对象保存到文件和从文件中读取对象 |
| 将对象存储在字典中 | 创建 Contact 类存储联系人信息,使用字典管理联系人,提供查找、添加、修改和删除功能 |

9. 代码操作流程分析

下面以 Contact 类管理联系人信息的程序为例,详细分析其操作流程:

graph LR;
    A[开始] --> B[加载联系人字典];
    B --> C{显示菜单并获取用户选择};
    C -- 查找 --> D[输入姓名查找联系人];
    C -- 添加 --> E[输入姓名、电话、邮箱添加联系人];
    C -- 修改 --> F[输入姓名,再输入新电话和邮箱修改信息];
    C -- 删除 --> G[输入姓名删除联系人];
    C -- 退出 --> H[保存联系人字典并退出];
    D --> C;
    E --> C;
    F --> C;
    G --> C;

具体步骤如下:
1. 加载联系人字典 :程序启动时,尝试从文件中加载联系人字典。若文件存在,读取字典;若文件不存在,创建空字典。
2. 显示菜单并获取用户选择 :显示操作菜单,用户输入选择的操作编号。
3. 执行相应操作
- 查找 :用户输入姓名,程序在字典中查找该联系人,若找到则显示信息,未找到则提示未找到。
- 添加 :用户输入姓名、电话和邮箱,程序创建 Contact 对象,若姓名不存在于字典中,则添加该对象;若已存在,则提示已存在。
- 修改 :用户输入姓名,若该姓名存在于字典中,再输入新的电话和邮箱,更新联系人信息;若不存在,则提示未找到。
- 删除 :用户输入姓名,若该姓名存在于字典中,删除该联系人;若不存在,则提示未找到。
- 退出 :程序将联系人字典保存到文件中,然后退出。

10. 代码优化建议

虽然上述代码已经实现了基本的功能,但在实际应用中,还可以进行一些优化:
- 错误处理 :在用户输入数据时,增加更多的错误处理。例如,在输入零售价格或电话号码时,确保输入的是有效的数字或格式。

try:
    retail = float(input('Enter the retail price: '))
except ValueError:
    print('Invalid input for retail price. Please enter a valid number.')
  • 用户界面优化 :可以使用更友好的用户界面,如图形界面(GUI),提高用户体验。Python 中有许多 GUI 库可供选择,如 Tkinter PyQt 等。
  • 代码复用 :将一些通用的功能封装成独立的函数或类,提高代码的复用性。例如,将输入验证的逻辑封装成一个函数。
def validate_input(prompt, input_type):
    while True:
        try:
            if input_type == 'float':
                value = float(input(prompt))
            elif input_type == 'int':
                value = int(input(prompt))
            else:
                value = input(prompt)
            return value
        except ValueError:
            print('Invalid input. Please try again.')
11. 实际应用场景

上述代码所涉及的技术在许多实际应用场景中都有广泛的应用:
- 库存管理系统 :可以使用 CellPhone 类来管理手机库存,记录每部手机的信息,如制造商、型号、价格等。通过列表或字典存储手机对象,方便进行查找、添加、修改和删除操作。
- 联系人管理软件 :使用 Contact 类管理联系人信息,用户可以方便地查找、添加、修改和删除联系人。同时,通过序列化和反序列化技术,可以将联系人信息保存到文件中,下次启动程序时加载。
- 游戏开发 :在游戏开发中, Coin 类可以用于模拟游戏中的道具或角色状态。每个 Coin 对象可以有不同的状态,通过调用方法改变状态,增加游戏的趣味性。

总结与展望

通过本文的学习,我们深入了解了 Python 面向对象编程中类的实例操作、对象的存储和传递、序列化和反序列化等重要技术。这些技术为我们开发复杂的应用程序提供了强大的支持。

在未来的开发中,我们可以进一步拓展这些技术的应用。例如,结合数据库技术,将对象存储到数据库中,实现更高效的数据管理;使用多线程或异步编程技术,提高程序的性能和响应速度。同时,不断优化代码结构和用户界面,提高程序的易用性和可维护性。

流程图

graph LR;
    A[开始] --> B[选择应用场景];
    B -- 库存管理系统 --> C[使用 CellPhone 类管理库存];
    B -- 联系人管理软件 --> D[使用 Contact 类管理联系人];
    B -- 游戏开发 --> E[使用 Coin 类模拟道具或角色状态];
    C --> F[进行增删改查操作];
    D --> F;
    E --> F;
    F --> G[优化代码和用户界面];
    G --> H[结合其他技术拓展功能];

表格

应用场景 涉及类 主要操作
库存管理系统 CellPhone 查找、添加、修改、删除手机信息
联系人管理软件 Contact 查找、添加、修改、删除联系人信息
游戏开发 Coin 改变对象状态,增加游戏趣味性
内容概要:本文设计了一种基于PLC的全自动洗衣机控制系统内容概要:本文设计了一种,采用三菱FX基于PLC的全自动洗衣机控制系统,采用3U-32MT型PLC作为三菱FX3U核心控制器,替代传统继-32MT电器控制方式,提升了型PLC作为系统的稳定性自动化核心控制器,替代水平。系统具备传统继电器控制方式高/低水,实现洗衣机工作位选择、柔和过程的自动化控制/标准洗衣模式切换。系统具备高、暂停加衣、低水位选择、手动脱水及和柔和、标准两种蜂鸣提示等功能洗衣模式,支持,通过GX Works2软件编写梯形图程序,实现进洗衣过程中暂停添加水、洗涤、排水衣物,并增加了手动脱水功能和、脱水等工序蜂鸣器提示的自动循环控制功能,提升了使用的,并引入MCGS组便捷性灵活性态软件实现人机交互界面监控。控制系统通过GX。硬件设计包括 Works2软件进行主电路、PLC接梯形图编程线关键元,完成了启动、进水器件选型,软件、正反转洗涤部分完成I/O分配、排水、脱、逻辑流程规划水等工序的逻辑及各功能模块梯设计,并实现了大形图编程。循环小循环的嵌; 适合人群:自动化套控制流程。此外、电气工程及相关,还利用MCGS组态软件构建专业本科学生,具备PL了人机交互C基础知识和梯界面,实现对洗衣机形图编程能力的运行状态的监控操作。整体设计涵盖了初级工程技术人员。硬件选型、; 使用场景及目标:I/O分配、电路接线、程序逻辑设计及组①掌握PLC在态监控等多个方面家电自动化控制中的应用方法;②学习,体现了PLC在工业自动化控制中的高效全自动洗衣机控制系统的性可靠性。;软硬件设计流程 适合人群:电气;③实践工程、自动化及相关MCGS组态软件PLC的专业的本科生、初级通信联调工程技术人员以及从事;④完成PLC控制系统开发毕业设计或工业的学习者;具备控制类项目开发参考一定PLC基础知识。; 阅读和梯形图建议:建议结合三菱编程能力的人员GX Works2仿真更为适宜。; 使用场景及目标:①应用于环境MCGS组态平台进行程序高校毕业设计或调试运行验证课程项目,帮助学生掌握PLC控制系统的设计,重点关注I/O分配逻辑、梯形图实现方法;②为工业自动化领域互锁机制及循环控制结构的设计中类似家电控制系统的开发提供参考方案;③思路,深入理解PL通过实际案例理解C在实际工程项目PLC在电机中的应用全过程。控制、时间循环、互锁保护、手动干预等方面的应用逻辑。; 阅读建议:建议结合三菱GX Works2编程软件和MCGS组态软件同步实践,重点理解梯形图程序中各环节的时序逻辑互锁机制,关注I/O分配硬件接线的对应关系,并尝试在仿真环境中调试程序以加深对全自动洗衣机控制流程的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值