Python面向对象编程:属性和方法②

news2024/11/24 22:41:18

在这里插入图片描述

文章目录

    • 一、什么是属性和方法
      • 1.1 属性
      • 1.2 方法
    • 二、定义和使用属性
      • 2.1 定义实例属性
      • 2.2 访问和修改实例属性
      • 2.3 定义类属性
      • 2.4 访问和修改类属性
    • 三、定义和使用方法
      • 3.1 定义实例方法
      • 3.2 调用实例方法
      • 3.3 定义类方法
      • 3.4 调用类方法
      • 3.5 定义静态方法
      • 3.6 调用静态方法
    • 四、综合详细例子
      • 4.1 项目结构
      • 4.2 模块代码
        • account.py
        • bank.py
      • 4.3 主程序代码
        • main.py
      • 4.4 运行结果
    • 五、总结

面向对象编程(OOP)是Python中一个重要的编程范式,它通过类和对象的概念来组织代码。类和对象的核心在于属性和方法,它们分别代表对象的状态和行为。本文将详细介绍Python面向对象编程中的属性和方法,并通过一个综合详细的例子来展示它们的实际应用。

一、什么是属性和方法

1.1 属性

属性是类的变量,用于存储对象的状态。属性可以分为实例属性和类属性:

  • 实例属性:每个对象独立拥有的属性,通过self来访问和修改。
  • 类属性:所有对象共享的属性,通过类名访问和修改。

1.2 方法

方法是类的函数,用于定义对象的行为。方法可以分为实例方法、类方法和静态方法:

  • 实例方法:与对象关联的方法,第一个参数必须是self,表示类的实例。
  • 类方法:与类关联的方法,第一个参数必须是cls,表示类本身。使用@classmethod装饰器。
  • 静态方法:独立于类和对象的方法,不需要selfcls参数。使用@staticmethod装饰器。

二、定义和使用属性

2.1 定义实例属性

实例属性在__init__方法中定义,并通过self访问和修改:

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

2.2 访问和修改实例属性

可以通过对象访问和修改实例属性:

person = Person("Alice", 30)
print(person.name)  # 输出:Alice
print(person.age)   # 输出:30

person.age = 31
print(person.age)   # 输出:31

2.3 定义类属性

类属性在类内部定义,并通过类名访问和修改:

class Person:
    species = "Homo sapiens"

    def __init__(self, name, age):
        self.name = name
        self.age = age

2.4 访问和修改类属性

可以通过类名或对象访问和修改类属性:

print(Person.species)  # 输出:Homo sapiens

person = Person("Alice", 30)
print(person.species)  # 输出:Homo sapiens

Person.species = "Homo sapiens sapiens"
print(person.species)  # 输出:Homo sapiens sapiens

三、定义和使用方法

3.1 定义实例方法

实例方法在类内部定义,并通过self访问实例属性和其他方法:

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

    def greet(self):
        return f"Hello, my name is {self.name} and I am {self.age} years old."

3.2 调用实例方法

可以通过对象调用实例方法:

person = Person("Alice", 30)
print(person.greet())  # 输出:Hello, my name is Alice and I am 30 years old.

3.3 定义类方法

类方法使用@classmethod装饰器,并通过cls访问类属性和其他类方法:

class Person:
    species = "Homo sapiens"

    def __init__(self, name, age):
        self.name = name
        self.age = age

    @classmethod
    def species_info(cls):
        return f"All persons belong to the species {cls.species}."

3.4 调用类方法

可以通过类名或对象调用类方法:

print(Person.species_info())  # 输出:All persons belong to the species Homo sapiens.

person = Person("Alice", 30)
print(person.species_info())  # 输出:All persons belong to the species Homo sapiens.

3.5 定义静态方法

静态方法使用@staticmethod装饰器,不需要selfcls参数:

class Math:
    @staticmethod
    def add(x, y):
        return x + y

3.6 调用静态方法

可以通过类名或对象调用静态方法:

print(Math.add(5, 3))  # 输出:8

math_instance = Math()
print(math_instance.add(5, 3))  # 输出:8

四、综合详细例子

下面是一个综合详细的例子,展示如何使用类和对象实现一个简单的银行账户管理系统。

4.1 项目结构

bank_management/
    __init__.py
    account.py
    bank.py
main.py

4.2 模块代码

account.py
# bank_management/account.py

class Account:
    interest_rate = 0.05  # 类属性,利率

    def __init__(self, account_number, account_holder, balance=0):
        self.account_number = account_number  # 实例属性,账户号
        self.account_holder = account_holder  # 实例属性,账户持有人
        self.balance = balance  # 实例属性,余额

    def deposit(self, amount):
        if amount > 0:
            self.balance += amount
            return True
        return False

    def withdraw(self, amount):
        if 0 < amount <= self.balance:
            self.balance -= amount
            return True
        return False

    @classmethod
    def set_interest_rate(cls, rate):
        cls.interest_rate = rate

    @staticmethod
    def calculate_interest(balance):
        return balance * Account.interest_rate

    def __str__(self):
        return f"Account[{self.account_number}] - {self.account_holder}, Balance: {self.balance}"
bank.py
# bank_management/bank.py

from .account import Account

class Bank:
    def __init__(self, name):
        self.name = name
        self.accounts = []

    def create_account(self, account_number, account_holder, balance=0):
        account = Account(account_number, account_holder, balance)
        self.accounts.append(account)
        return account

    def find_account(self, account_number):
        for account in self.accounts:
            if account.account_number == account_number:
                return account
        return None

    def __str__(self):
        return f"Bank[{self.name}] - Accounts: {len(self.accounts)}"

4.3 主程序代码

main.py
# main.py

from bank_management.bank import Bank

def main():
    bank = Bank("MyBank")

    # 创建账户
    account1 = bank.create_account("123456", "Alice", 1000)
    account2 = bank.create_account("654321", "Bob", 500)

    # 存款和取款
    account1.deposit(500)
    account2.withdraw(200)

    # 打印账户信息
    print(account1)
    print(account2)

    # 设置和计算利息
    Account.set_interest_rate(0.03)
    interest = Account.calculate_interest(account1.balance)
    print(f"Interest on {account1.account_holder}'s balance: {interest}")

    # 查找账户
    account = bank.find_account("123456")
    if account:
        print(f"Found account: {account}")

    # 打印银行信息
    print(bank)

if __name__ == "__main__":
    main()

4.4 运行结果

Account[123456] - Alice, Balance: 1500
Account[654321] - Bob, Balance: 300
Interest on Alice's balance: 45.0
Found account: Account[123456] - Alice, Balance: 1500
Bank[MyBank] - Accounts: 2

五、总结

本文详细介绍了Python面向对象编程中的属性和方法,包括实例属性和类属性、实例方法、类方法和静态方法等概念。通过综合详细的例子展示了如何在实际项目中应用这些概念。希望本文对你理解和掌握Python面向对象编程中的属性和方法有所帮助。


欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2196392.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT背景下,高职人工智能技术应用专业的人才培养

一、引言 ChatGPT&#xff0c;即聊天生成预训练变换器&#xff0c;由美国OpenAI公司开发&#xff0c;自2022年11月首次亮相以来&#xff0c;已成为人工智能领域的一个标志性成就。这款聊天机器人利用先进的人工智能技术&#xff0c;处理自然语言&#xff0c;能够精准把握用户的…

【实战教程】SpringBoot全面指南:快速上手到项目实战(SpringBoot)

文章目录 【实战教程】SpringBoot全面指南&#xff1a;快速上手到项目实战(SpringBoot)1. SpringBoot介绍1.1 SpringBoot简介1.2系统要求1.3 SpringBoot和SpringMVC区别1.4 SpringBoot和SpringCloud区别 2.快速入门3. Web开发3.1 静态资源访问3.2 渲染Web页面3.3 YML与Properti…

ctf.bugku - 本地管理员

题目来源&#xff1a;本地管理员 - Bugku CTF 访问页面 页面的最后返回一个字符串&#xff1b; 结尾 应该是base64 编码&#xff1b; 解码得到 test123 同时&#xff0c;提示信息还有 IP禁止访问&#xff0c;本地管理员登陆&#xff1b; 所以&#xff0c;请求头添加&#x…

“欢迎”相关英语表达柯桥成人商务英语口语学习到蓝天广场

1.某地的欢迎标语 说到欢迎&#xff0c;小编想起了江苏的欢迎标语。 这则标语把“江苏欢迎您”&#xff0c;翻译成了“Jiangsu welcomes you”。 不少小伙伴都觉得这样翻译不对&#xff0c;“欢迎您来某某地方”&#xff0c;应该翻译成“Welcome to XX”。 但其实&#xff0c;一…

超声波气象监测站的工作原理

TH-CQX5超声波气象监测站&#xff0c;顾名思义&#xff0c;是一种通过超声波技术实现气象数据监测的设备。这种监测站的设计理念充分利用了超声波在空气中传播的特性&#xff0c;能够高效、准确地测量风速、风向、温度、湿度等气象要素。超声波气象监测站的构造简洁而高效&…

华为OD机试 - 银行插队 - 队列(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

前端vue-安装pinia,它和vuex的区别

创建一个store的目录&#xff0c;任意一个js文件&#xff0c;再导入pinia&#xff0c;再定义

想走?可以!先买票——迭代器模式

文章目录 想走&#xff1f;可以&#xff01;先买票——迭代器模式乘车买票&#xff0c;不管你是谁&#xff01;迭代器模式迭代器实现Java的迭代器实现迭代高手 想走&#xff1f;可以&#xff01;先买票——迭代器模式 乘车买票&#xff0c;不管你是谁&#xff01; 时间&#…

【2024版】最新kali linux入门及常用简单工具介绍(非常详细)零基础入门到精通,收藏这一篇就够了_kalilinux

一、介绍 kali Linux Kali Linux 是一个基于 Debian 的 Linux 发行版&#xff0c;主要用于数字取证和渗透测试。它预装了大量的安全审计和渗透测试工具&#xff0c;被广泛应用于网络安全领域。 &#xff08;一&#xff09;特点 工具丰富&#xff1a;集成了数百种用于渗透测试…

越差越好?为什么简单反而赢了,这背后究竟有什么秘诀?

你有没有发现,软件界里那些最成功的产品,往往并不是最复杂、最强大的?我们用的很多东西,看起来功能普通,甚至有些粗糙,但就是这样简陋的设计,反而成了市场上的赢家。 也许你玩过Flappy Bird这个游戏:它的设计非常简单,玩家只需要点击屏幕让小鸟飞行,避开管道障碍。游…

知名开发工具RubyMine全新发布v2024.2——增加浏览器保护的代码洞察

RubyMine 是一个为Ruby 和 Rails开发者准备的 IDE&#xff0c;其带有所有开发者必须的功能&#xff0c;并将之紧密集成于便捷的开发环境中。 立即获取RubyMine v2024.2正式版 具体更新详情如下&#xff1a; Rails 对Kamal配置文件的补全 RubyMine现在为 Kamal 配置文件提供…

代码随想录算法训练营Day28 | 39. 组合总和、40.组合总和Ⅱ、131.分割回文串

目录 39. 组合总和 40.组合总和Ⅱ 131.分割回文串 39. 组合总和 题目 39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不…

Pytorch实现CNN实验

一、实验要求 用 python 的 Pytorch模块实现卷积神经网络。网络结构为一个输入层、两个卷积层、一个全连接层、一个输出层。 二、实验目的 实现一个包含卷积层、池化层和全连接层的卷积神经网了解如何在训练数据集上使用反向传播算法和Adam优化算法训练神经网络。加深对卷积…

国外电商系统开发-运维系统文件上传-高级上传

如果您要上传文件到10台服务器中&#xff0c;有3台服务器的路径不是一样的&#xff0c;那么在这种情况下您就可以使用本功能&#xff0c;单独执行不一样的路径 点击【高级】上传

雷池+frp 批量设置proxy_protocol实现真实IP透传

需求 内网部署safeline&#xff0c;通过frp让外网访问内部web网站服务&#xff0c;让safeline记录真实外网攻击IP safeline 跟 frp都部署在同一台服务器&#xff1a;192.168.2.103 frp client 配置 frpc只需要在https上添加transport.proxyProtocolVersion "v2"即…

【星汇极客】STM32 HAL库+CubeMX开发之用户代码规范(持续更新)

前言 本人是一名嵌入式学习者&#xff0c;在大学期间也参加了不少的竞赛并获奖&#xff0c;包括&#xff1a;江苏省电子设计竞赛省一、睿抗机器人国二、中国高校智能机器人国二、嵌入式设计竞赛国三、光电设计竞赛国三、节能减排竞赛国三等。 暑假的时候参加了太多的比赛&#…

ComfyUI 实战教程:古人画像变真人

最近看到一种古画变真人的效果&#xff0c;就是将书上的古人画像重绘为真人&#xff0c;效果炸裂&#xff0c;不敢独享&#xff0c;特别分享给大家。 效果演示 废话不多说&#xff0c;还是先看效果。大家可以猜猜它们都是谁&#xff5e; 使用方法 这个方法在 Stable Diffusi…

斩获ICDAR历史地图OCR比赛冠军:我们如何处理密集旋转交叉文本?

ICDAR 比赛简介 ICDAR 比赛 https://rrc.cvc.uab.es/是国际公认的文字领域权威的比赛&#xff0c;文字领域顶会论文里的数据测评和测评指标往往都来源于ICDAR比赛的数据和指标&#xff0c;每年一般会有几个大类的赛事&#xff0c;然后每个赛事会细分3-4个比赛。ICDAR竞赛因其极…

APP未上架开通微信支付流程分享

在移动互联网时代&#xff0c;支付功能的便捷性对于APP的成功至关重要。即便APP尚未上架至应用商店&#xff0c;开发者仍可以提前开通微信支付功能&#xff0c;以便进行内部测试、预售活动或特定场景下的支付需求。本文将详细介绍APP未上架时如何开通微信支付的流程&#xff0c…

74.【C语言】文件操作(1)

目录 1.进行文件操作的原因 销毁的示例 2.文件的类型 1.操作文件的步骤 2.文件名 3.查看文件路径的方法 方法1 方法2 方法3 4.数据文件的介绍 举例 ① ASCII码的形式(即字符形式)存储 01.手动写入数据 02.用程序写入数据 ②二进制形式存储 理解"不加转换&…