量化交易入门(七)Python开发-面向对象和类

在Python中,面向对象(OO)是一种编程范式或思想,它将现实世界中的实体抽象为对象(Object),通过对象之间的交互来解决问题,在量化交易中,它可以帮助我们更好地组织和管理复杂的交易策略和系统。在面向对象编程中,我们把数据和操作数据的方法封装在对象内部,通过对象的属性(Attribute)和方法(Method)来描述对象的特征和行为。

面向对象编程的主要特点包括:

对象(Object):对象是面向对象编程的基本单位,它代表现实世界中的实体或概念。每个对象都有自己的属性和方法,可以与其他对象进行交互。

类(Class):类是对象的蓝图或模板,定义了对象的属性和方法。通过类,我们可以创建出具有相同属性和方法的多个对象实例。

封装(Encapsulation):封装是指将数据和操作数据的方法绑定在一起,形成一个逻辑上的整体。通过封装,对象可以隐藏其内部细节,只暴露必要的接口给外部使用,提供了数据保护和隐藏。

继承(Inheritance):继承是一种机制,允许我们创建新的类(子类或派生类),这些类可以继承现有类(父类或基类)的属性和方法。通过继承,我们可以实现代码的重用和扩展。

多态(Polymorphism):多态是指同一操作或函数在不同的对象上可以具有不同的行为。通过多态,我们可以使用相同的接口来处理不同类型的对象,提高代码的灵活性和可扩展性。

Python提供了定义类和创建对象的语法,并支持面向对象的特性,如封装、继承和多态。

1、类的定义和封装

让我们以一个现实生活中的人为例,来讲解Python中的类。

假设我们要描述一个人,他有以下属性:

  • 姓名(name)
  • 年龄(age)
  • 性别(gender)
  • 身高(height)

同时,这个人可以执行以下动作:

  • 说话(speak)
  • 走路(walk)
  • 吃饭(eat)

现在,让我们用Python中的类来表示这个人:

class Person:def __init__(self, name, age, gender, height):self.name = nameself.age = ageself.gender = genderself.height = heightdef speak(self, words):print(f"{self.name} says: {words}")def walk(self, distance):print(f"{self.name} walks {distance} meters.")def eat(self, food):print(f"{self.name} eats {food}.")

在这个Person类中,我们定义了四个属性:name,age,gender和height,它们分别表示一个人的姓名、年龄、性别和身高。这些属性在__init__方法中初始化。

我们还定义了三个方法:speak,walk和eat,它们分别表示一个人说话、走路和吃饭的动作。这些方法都接受一个参数,并在方法内部使用print函数输出相应的信息。

现在,让我们创建一个Person类的实例,并调用它的方法:

person = Person("Alice", 25, "Female", 165)person.speak("Hello, how are you?")
person.walk(500)
person.eat("an apple")

输出结果:

Alice says: Hello, how are you?
Alice walks 500 meters.
Alice eats an apple.

在这个例子中,我们创建了一个名为person的Person类实例,并传入了姓名、年龄、性别和身高的参数。然后,我们调用person实例的speak,walk和eat方法,并传入相应的参数。

通过这个例子,我们可以看到,类可以用来描述现实生活中的事物,并将其属性和行为封装在一个单独的实体中。这种方式使我们能够以一种更加结构化和组织化的方式来表示复杂的系统和概念。

2、私有变量和公有变量

私有变量和公有变量的主要区别在于访问权限和使用场景。

(1)公有变量(Public Variables):

  • 公有变量可以在类内部和类外部自由访问和修改。
  • 在Python中,类中的所有变量默认都是公有的。
  • 公有变量的命名约定是使用小写字母和下划线的组合,例如variable_name。
  • 公有变量通常用于存储类的一般属性,这些属性可以被类的方法和外部代码直接访问和修改。

示例:

class Person:def __init__(self, name, age):self.name = name  # 公有变量self.age = age    # 公有变量person = Person("Alice", 25)
print(person.name)  # 输出: Alice
person.age = 26
print(person.age)   # 输出: 26

(2)私有变量(Private Variables):

  • 私有变量只能在类的内部访问和修改,外部代码无法直接访问或修改私有变量。
  • 在Python中,我们通过在变量名前面加上两个下划线__来表示一个变量是私有的。
  • 私有变量的命名约定是使用两个下划线作为前缀,后跟小写字母和下划线的组合,例如__variable_name。
  • 私有变量通常用于存储类的内部状态或敏感信息,这些信息不应该被外部代码直接访问或修改。
  • 虽然Python没有真正的私有机制,但是使用双下划线前缀的变量名会被"名称修饰(name mangling)",使其在类外部难以访问。

示例:

class BankAccount:def __init__(self, account_number, balance):self.__account_number = account_number  # 私有变量self.__balance = balance                # 私有变量def deposit(self, amount):self.__balance += amountdef withdraw(self, amount):if amount <= self.__balance:self.__balance -= amountelse:print("Insufficient balance.")account = BankAccount("1234567890", 1000)
# account.__balance = 2000  # 这行代码会引发AttributeError,因为__balance是私有变量
account.deposit(500)
account.withdraw(200)

在这个例子中,我们定义了一个BankAccount类,其中__account_number和__balance是私有变量,表示银行账户的账号和余额。我们提供了deposit和withdraw方法来存款和取款,这些方法可以访问和修改私有变量。但是,外部代码无法直接访问或修改这些私有变量。

总的来说,公有变量用于存储可以公开访问和修改的属性,而私有变量用于存储类的内部状态或敏感信息,以防止外部代码的直接访问和修改。在设计类时,我们应该根据具体的需求来决定使用公有变量还是私有变量。通常,我们应该尽可能使用私有变量来封装类的内部状态,并提供公有的方法来访问和修改这些状态。这样可以提高类的安全性和可维护性。

3、类的继承和多态

现在,让我们通过继承来创建一个新的类Student,它继承自Person类:

class Student(Person):def __init__(self, name, age, student_id):super().__init__(name, age)self.student_id = student_iddef study(self, subject):print(f"{self.name} studies {subject}.")

在这个例子中,Student类继承了Person类的所有属性和方法。通过使用super().__init__(name, age),我们调用了父类的构造函数,初始化了name和age属性。此外,Student类还添加了一个新的属性student_id和一个新的方法study。

现在,让我们创建另一个类Teacher,它也继承自Person类:

class Teacher(Person):def __init__(self, name, age, subject):super().__init__(name, age)self.subject = subjectdef teach(self, topic):print(f"{self.name} teaches {topic} in {self.subject}.")

Teacher类同样继承了Person类的属性和方法,并添加了一个新的属性subject和一个新的方法teach。

现在,让我们创建Student和Teacher的实例,并演示多态:

student = Student("Alice", 20, "S001")
teacher = Teacher("Bob", 35, "Math")people = [student, teacher]for person in people:person.speak("Hello!")person.walk(10)person.eat("lunch")if isinstance(person, Student):person.study("Python")elif isinstance(person, Teacher):person.teach("Algebra")

在这个例子中,我们创建了一个Student实例和一个Teacher实例,并将它们放在一个列表people中。然后,我们使用一个for循环遍历people列表,对每个实例调用speak、walk和eat方法。这展示了多态的概念,即我们可以使用相同的接口(Person类的方法)来处理不同类型的对象(Student和Teacher)。

此外,我们使用isinstance函数来检查每个实例的类型,并根据类型调用特定的方法(study或teach)。这展示了如何在运行时根据对象的实际类型来执行不同的操作。

通过继承和多态,我们可以创建具有层次结构的类,重用代码,并编写通用的代码来处理不同类型的对象。这使我们能够更好地组织和扩展代码,提高代码的可读性和可维护性。

示例代码地址:https://github.com/gzmusem/QuantExamples/tree/main/Examples04

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

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

相关文章

Day22初识集合

Day22初识集合 一、集合 1、概念&#xff1a; 集合是指将多个元素组合在一起的数据结构。在编程中&#xff0c;集合用于存储和操作一组相关的数据对象。与数组相比&#xff0c;集合具有更灵活、动态和高级的功能。 2、常见的集合类&#xff1a; List&#xff08;列表&#x…

454.四数相加

给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 方法一&#xff1a; 双层for循环&#xff0c;将nums1、…

KY115 后缀字串排序

描述&#xff1a; 对于一个字符串&#xff0c;将其后缀子串进行排序&#xff0c;例如grain 其子串有&#xff1a; grain rain ain in n 然后对各子串按字典顺序排序&#xff0c;即&#xff1a; ain,grain,in,n,rain 输入描述&#xff1a; 每个案例为一行字符串。 输出描述&…

JS的Document属性和方法

在javascript中&#xff0c;document对象是一个非常重要的全局对象&#xff0c;它代表整个html文档。你可以通过document对象来访问和修改html文档的内容和结构。以下是一些常见的document属性和方法&#xff1a; 属性 1、document.title&#xff1a;获取或设置文档的标题&am…

HTML 特殊元素:展示PDF、展示JSON 数据

<pre> 标签 (preformatted text) <pre> 标签用来表示预格式化的文本内容 在页面数据展示时&#xff0c;后端返回了一段未经处理的JSON 数据&#xff0c;将这段数据在页面正常展示&#xff0c;让可读性更高。 {/"project": {/ "title": "…

TSP问题消除子环

个人感觉看这一个就够了&#xff01;&#xff01;&#xff01; 优化│TSP中两种不同消除子环路的方法及callback实现&#xff08;Python调用Gurobi求解&#xff09; 刘兴禄运筹学修炼日记&#xff1a;TSP中两种不同消除子环路的方法及callback实现&#xff08;Python调用Guro…

sentry-cli - error: Failed to load .sentryclirc file from project path

Xcode 15.2 warning sentry-cli - error: Failed to load .sentryclirc file from project path (/Users/zhuhongwei/Desktop/pandabill/.sentryclirc)推荐一下刚上线的 App 熊猫小账本&#xff0c;里面有用到这篇博客讲的内容 熊猫小账本 一个简洁的记账 App&#xff0c;用于…

1、鸿蒙学习-为应用/服务进行签名

针对应用/服务的签名&#xff0c;DevEco Studio为开发者提供了自动签名方案&#xff0c;帮助开发者高效进行调试。也可选择手动方式对应用/服务进行签名&#xff0c;如果使用了需要ACL的权限&#xff0c;需采用手动方式进行签名。 自动签名 说明 使用自动签名前&#xff0c;请…

AI智能报表助手

AI智能报表助手 目标&#xff1a;通过对话一句话智能引导出报表 NL2SQL 自然语言转换为sql 数据集 ATIS&GeoQuery数据集&#xff1a;ATIS数据集来源于机票订阅系统&#xff0c;与美国的地理相关&#xff0c;包含880条问题及对应的SQL语句&#xff0c;属于单一领域但上…

C++ 【深基3.习8】三角形分类

文章目录 一、题目描述【深基3.习8】三角形分类题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 样例 #3样例输入 #3样例输出 #3 样例 #4样例输入 #4样例输出 #4 提示 二、参考代码 一、题目描述 【深基3.习8】三角形分类 题目描述 给…

闭包机制的底层实现原理

说明:此次分享不涉及ES6的let,const,块级作用域,这些其实都是对本次分享内容的扩展。 闭包的重要性 JS的内功心法,闭包是JavaScript中非常重要的核心概念,关系着JS里很多核心的机制,理解了它,很多问题都会迎刃而解,不理解闭包用JS永远像隔着一层窗户纸。 前端发展日新…

【MySQL】学习和总结使用列子查询查询员工工资信息

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-5odctDvQ0AHJJc1C {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

中国(京津冀)太阳能光伏推进大会暨展览会

中国(京津冀)太阳能光伏推进大会暨展览会是一个旨在促进太阳能光伏产业的发展的重要活动。该活动旨在加大对太阳能光伏的投资和支持&#xff0c;推动太阳能光伏技术的创新和应用&#xff0c;促进太阳能光伏产业的规模化发展。 此次大会暨展览会将为太阳能光伏行业相关企业提供一…

LeetCode刷题记录——day2

https://leetcode.cn/problems/product-of-array-except-self/description/?envTypestudy-plan-v2&envIdtop-interview-150 问题在于不使用除法并且空间复杂度为O(1)&#xff0c;当第一次从头开始遍历时由于不知道后续数组元素是什么&#xff0c;所以无法得到答案&#xf…

Python 枚举(Python Enumerations)

Python 枚举&#xff08;Enumerations&#xff09;是一种用于创建命名的常量集合的方法。它提供了一种更好地组织代码、增加可读性和可维护性的方式&#xff0c;特别是在需要表示一组相关常量时。 Python 的枚举是通过 enum 模块实现的&#xff0c;它在 Python 3.4 版本之后成…

【Linux】Linux基本开发工具(yum) (vi/vim)的使用

本文章内容&#xff1a; 学习yum工具&#xff0c;进行软件安装掌握vim编辑器使用 Linux 软件包管理器 yum 什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成…

es 聚合操作(一)

前言 Elasticsearch除搜索以外&#xff0c;提供了针对ES 数据进行统计分析的功能。聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如&#xff1a; 衣服品牌的受欢迎程度这些衣服的平均价格、最高价格、最低价格这些衣服的每天、每月销量如何 使用…

产品推荐 | 基于Xilinx Zynq UltraScale+打造的仙女座 Andromeda FPGA核心板

1、产品概述 仙女座Andromeda XZU65片上系统&#xff08;SoC&#xff09;核心板通过结合高端Xilinx Zynq UltraScale™ MPSoC系列芯片和高速DDR4 ECC SDRAM、eMMC flash、双QSPI flash、双Gigabit Ethernet PHY、USB 3.0形成了一个完整的、功能强大的嵌入式处理系统。得益于大…

Rhino与Revit API之间的转换

你好&#xff0c;我是九哥~ 最近发现Rhino.Inside.Revit的API手册更新了&#xff0c;终于可以开心的写RIR代码了&#xff0c;小伙伴快去试试吧&#xff0c;地址如下&#xff1a; https://www.rhino3d.com/inside/revit/1.0/reference/rir-api 今天我们先来聊聊 Rhino 与 Rev…