BioPython ② | 面向对象编程Object Oriented Programming

news2025/7/6 17:04:45

BioPython ② | Python面向对象编程

题目要求

  1. 定义分子类(Molecule)作为基类,包含集合elements和weight作为其属性,用初始化函数,将elements初始化为空集,weight初始化为None;定义show_weight方法,该方法用print函数打印输出分子量weight;定义show_elements方法,用print函数打印输出元素集合。
  2. 定义AminoAcid类,继承Molecule类,包含composition属性,并初始化为下面的元素字典:{‘C’: 0, ‘H’: 0, ‘O’: 0, ‘N’: 0, ‘S’: 0};定义calc_mw方法,根据根据字典的元素组成,计算其分子量(需要用到每种原子的质量,自己去查),并给继承自父类的weight属性赋值;重载show_weight方法,在其中调用calc_mw方法,计算氨基酸的分子量,再调用父类的show_weight方法,打印输出weight值;重载show_elements方法,用元素字典中的非零值的键生成元素集合,再打印输出元素集合。
  3. 分别定义亮氨酸(Leucine)、异亮氨酸(Isoleucine)、半胱氨酸(Cysteine)类,均继承自AminoAcid类,在初始化方法中,根据这三种氨基酸的元素组成(这个要自己去查),为其继承来的元素字典的各元素对应赋值;定义show_composition方法,打印输出氨基酸的元素字典;在Leucine类中定义is_isoform方法,接受一个氨基酸对象作为参数,根据氨基酸的元素组成,判断是否为当前氨基酸的同分异构体,返回布尔值(True或者False)。
  4. 分别生成Leucine、Isoleucine、Cysteine类的实例leu、iso、cys,通过该实例,调用其show_weight、show_elements、show_composition等方法,查看当前氨基酸的分子量、元素集合、元素字典;通过leu,调用其is_isoform方法,分别以实例iso和cys为参数,查看各自的返回值,以判定是否同分异构体。

关键点

我们一个一个来看,我把题目的关键点已经高亮了:

  • 初始化函数:简单来说就是指的__init __(),也就是构造函数(constructor)
  • 空集:这是说的py的一中数据类型——集合。集合(set)是一个无序的不重复元素序列。可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
  • 继承:这里得用到super().__init__(),如果子类和父类,都写了init方法,那么父类的init方法就会被子类覆盖。想调用父类的init方法需要用super去调用;
  • 计算分子量:这里就是原子个数的字典和相对原子质量的字典对应相乘,然后求和。这里用到了map(),一行代码就解决了;
  • 非零值:这里是筛选字典中的元素,可以不用循环,用filter()也是一行解决;
  • 同分异构体:也就是分子式相同的,在这里也就是elements这个字典类型的数据相同,判断两个字典是否相同,可以直接用==来判断,python已经内置重载了==,极其方便。

代码实现

注释比较详细,下面就是代码了~

class Molecule:
    '''
    Molecule类
    elements初始化为空集,weight初始化为 None;
    show_weight方法,该方法用print函数打印输出分子量 weight;
    定义show_elements方法,用print函数打印输出元素集合。
    '''

    def __init__(self):
        # 用set()来初始化空集
        self.elements = set()
        self.weight = None

    def show_weight(self):
        print(self.weight)

    def show_elements(self):
        print(self.elements)


class AminoAcid(Molecule):
    '''
    AminoAcid类(继承Molecule类)
    composition:初始化的元素字典
    Molecular_mass:相对原子质量
    '''

    def __init__(self):
        super().__init__()
        self.composition = {'C': 0, 'H': 0, 'O': 0, 'N': 0, 'S': 0}
        self.Molecular_mass = {'C': 12, 'H': 1, 'O': 16, 'N': 14, 'S': 32}

    ''' 另一种写法:直接在calc_mw()中给self.weight赋值,后面直接调用show_weight()即可
    def calc_mw(self):
        self.weight = sum(map(lambda x, y: x * y, self.composition.values(), self.Molecular_mass.values()))'''

    def calc_mw(self):
        # 对应元素的个数和相对原子质量相乘并求和
        return sum(map(lambda x, y: x * y, self.composition.values(), self.Molecular_mass.values()))

    def show_weight(self):
        # 重新定义show_weight(),也就是更新了一下分子质量并且打印,
        self.weight = self.calc_mw()
        print(self.calc_mw())

    def show_elements(self):
        # 将原子个数大于0的原子重新组合成名为 elements 的集合
        self.elements = set(dict(filter(lambda item: item[1] > 0, self.composition.items())))
        print(self.elements)
        # print(type(self.elements))


class Leucine(AminoAcid):
    def __init__(self):
        super().__init__()
        self.composition = {'C': 6, 'H': 13, 'O': 2, 'N': 1, 'S': 0}

    def show_composition(self):
        # 与 elements类似,数据类型是字典
        self.elements = dict(filter(lambda item: item[1] > 0, self.composition.items()))
        print(self.elements)
        # print(type(self.elements))

    def is_isoform(self, another):
        # python内置重载了"==",可以实现字典相等与否的判断
        return True if self.elements == another.elements else False


class Isoleucine(AminoAcid):
    def __init__(self):
        super().__init__()
        self.composition = {'C': 6, 'H': 13, 'O': 2, 'N': 1, 'S': 0}

    def show_composition(self):
        self.elements = dict(filter(lambda item: item[1] > 0, self.composition.items()))
        print(self.elements)


class Cysteine(AminoAcid):
    def __init__(self):
        super().__init__()
        self.composition = {'C': 3, 'H': 7, 'O': 2, 'N': 1, 'S': 1}

    def show_composition(self):
        self.elements = dict(filter(lambda item: item[1] > 0, self.composition.items()))
        print(self.elements)


leu = Leucine()
iso = Isoleucine()
cys = Cysteine()

print("leu:")
leu.show_weight()
leu.show_elements()
leu.show_composition()
print("iso:")
iso.show_weight()
iso.show_elements()
iso.show_composition()
print("cys:")
cys.show_weight()
cys.show_elements()
cys.show_composition()

print("leu & iso: {}".format(leu.is_isoform(iso)))
print("leu & cys: {}".format(leu.is_isoform(cys)))

下面是运行结果:
在这里插入图片描述

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

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

相关文章

进阶 - Git的远程仓库

本篇文章,是基于我自用Windows(Win10)系统当做示例演示 Git的远程仓库 之前我们一直在探讨 Git 的一些命令,也提及了仓库的概念。如果只是在一个仓库里管理文件历史,Git 和 SVN 真没啥区别。 Git 是分布式版本控制系…

02 stata入门【计量经济学及stata应用】

安装:建议直接在微信搜索,很多公众号有安装包资源及下载教程 不同版本在基本功能上无较大差异,一般为SE,更为专业MP,只是在处理变量个数或容量等存在不同 界面 历史命令;结果窗口&命令窗口&#xff1b…

字节跳动岗位薪酬体系曝光,看完感叹:不服不行,想高薪还得是学这个。。。。

目录:导读 前言 01岗位职级 02岗位薪酬 03绩效考核与晋升 大厂软件测试岗经验分享 一、软件测试基础篇:2022版 二、MySQL篇:2022版 三、 Linux篇:2022版 四、 Web测试 五、接口测试 六、APP测试 七、性能测试 八、Se…

Nacos一些理解

下载Mysql //下载mysql docker pull mysql:5.7 //运行容器 docker run -p 3306:3306 --name mysql -v /home/mysql/log:/var/log/mysql -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORDxx -d mysql:5.7 将导入数据库 1.新建数据库 nacos /*Navicat Premiu…

HyperMesh宝典 | 跟着老师学,你也可以做好二次开发

说到二次开发,你的脑海里是不是浮现出了“码农”两个字?有人可能会问,码农又是什么? 你是不是觉得二次开发这种码农干的事情感觉起来也太困难了吧? 其实有时候二次开发真的很简单,懂一点二次开发会让你的工…

机器学习中的数学原理——多项式回归

这个专栏主要是用来分享一下我在机器学习中的学习笔记及一些感悟,也希望对你的学习有帮助哦!感兴趣的小伙伴欢迎私信或者评论区留言!这一篇就更新一下《白话机器学习中的数学——多项式回归》! 目录 一、什么多项式回归 二、算法…

Java#33(IO流)

目录 一.IO流 作用: (对于程序而言)用于读写数据(本地数据, 网络数据) 二.IO流体系 1.字节输出流 2.字节输入流 3.文件拷贝 3.字符集 字符流 字符输入流 字符输出流 缓冲流 转换流 序列化流 ​编辑反序列流 打印流 一.IO流 I: input O: output 流: 想流…

Linux下创建动态链接库与静态链接库

动态链接库 Linux下的动态链接库文件扩展名为so,可以用多个文件生成一个动态链接库。 在头文件中定义三个函数,三个函数分别于三个cpp文件中实现。 将三个cpp文件编译成动态库libdynamic.so -fPIC表示编译为位置独立的代码,如果不选择默…

使用YOLOv5练自己的数据集

说明 上次使用学习了如何运行yolov5检测自己的数据,这次学习yolov5如何训练自己的数据集 本次记录如何使用yolov5训练自己的数据集以及遇到报错解决方案 数据 使用数据:水果数据集 数据包含了png图片和相应的标注文件 切分数据 代码如下&#xff1…

[ vulhub漏洞复现篇 ] solr 远程命令执行(CVE-2019-0193)

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

Kubernetes的基础概念

一、Kubernetes的介绍 用于自动部署、扩展和管理"容器化(containerized)应用程序"的开源系统 可以理解成K8S是负责自动化运维管理多个容器化程序(比如Docker)的集群,是一个生态极其丰富的容器编排框架工具 …

【现场问题】zookeeper的集群,其中两台起来了,但是另外一台就是起不来,或者起来也是standalone

zookeeper问题现象集群的配置zookeeper的启动以及状态查看问题报错点问题现象 1、总共三台机器,node92,node93,node94 其中node92做了拉起,但是node93(leader)和node94(follower)&a…

浅谈MVVM ——Model-View-View-Model

浅谈MVVM ——Model-View-View-Model 前言: 笔者最近接到这样一个机器人项目,接入他们的机器人平台做二次开发,开发自己的opk移植到机器人上做医院展示使用。opk是必须使用机器人厂家提供的经过一定封装过的,该opk的架构是MVVM。…

48W字?GitHub上下载量破百万的阿里:图解Java、网络、算法笔记

Java基础这个东西,无论在哪个公司都被看得尤为重要,而面试中关于基础的问题也是层出不穷。所以基础可以说是重中之重,当你的基础打牢了,其他的也就没有那么重要了。 说到基础,无外乎操作系统,网络&#xf…

pikachu-CSRF-SSRF-RCE速通

pikachu-CSRF-SSRF-RCE速通 目录pikachu-CSRF-SSRF-RCE速通CSRFCSRF(get)CSRF(post)CSRF TokenSSRFSSRF(curl)SSRF(file_get_content)RCEexec "ping"RCE exec "eval"CSRF 跨站请求伪造,说的通俗一点就是攻击者构造出某个网站的数据包请求并部署…

p3.第一章 基础入门 -- Python编程基本概念 (三)

1.2.2 Python语言 1.2.2.1 Python发展 1989年圣诞节期间,为了打发无聊的时间,荷兰人Guido van Rossum(吉多范罗苏姆)(数学、计算机双硕士,2005年加入Google,2013年加入DropBox)&am…

JavaUUID的理解

可笑,你竟然不知道 Java 如何生成 UUID - 沉默王二博客 UUID是通用唯一标识符的意思,就是唯一不重复的一串字符。 UUID的用途: 随机生成的文件名;Java Web 应用程序的 sessionID;数据库表的主键;事务 ID&…

EMQ 助力阿里云洛神云网络构建新一代“亿级并发、百万级吞吐”NLB 网络型负载均衡系统

万物智联的数字化时代,我们正走在从“数据量变”到“连接质变”的道路上。在日益丰富的物联网应用场景中,实现海量设备与云端之间双向通信连接,分析并从中获得实时洞察成了打造成功物联网解决方案的核心推动因素。EMQ 映云科技(以下简称“EMQ”)作为全球领先的开源物联网基础设…

UE在TextRender上显示中文文本

文章目录 1.实现目标2.实现过程2.1 添加字体2.2 创建字体材质2.3 将字体应用到TextRender3.参考资料1.实现目标 UE的UMG可以正常支持中文,但是TextRender并不支持中文,因此需要添加本地离线中文字体库,使TextRender显示中文。 2.实现过程 2.1 添加字体 (1)选择User Int…

day6bom操作浏览器

apis-day6bom-操作浏览器 文章目录apis-day6bom-操作浏览器1、window对象1.1BOM(浏览器对象模型1.2定时器-延时函数1.3JS执行机制(重要)1.4 location对象1.5 navigator对象1.6histroy对象(用的少)2、swiper插件3、本地存储&#x…