首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >即使对象为None类型,也返回属性

即使对象为None类型,也返回属性
EN

Stack Overflow用户
提问于 2020-05-27 07:21:01
回答 1查看 39关注 0票数 0

这个示例可能不是很好,但原始代码更令人困惑,所以我尝试了简化版本,因此我有两个类

代码语言:javascript
复制
class Sample():
    def __init__(self, sample, antibody = None):
        self.sample = sample
        self.antibody = None
    def pass_in_sample(self, antibody):
        if antibody:
           self.antibody= antibody

class Antibody():
    def__init__(self, sequence):
        self.Antibody_sequence= sequence

antibody= Antibody(sequence)
sample_object = A(sample, antibody = antibody)

现在我正在解析一个很大的csv文件,有一些样本存在,但没有抗体

我正在尝试做以下事情

代码语言:javascript
复制
def main()
   for sample in sample_list:
      sample_object = Sample(sample)
      print(sample_object.Antibody.Antibody_sequence)

但是如果它的抗体一开始就是None,那么即使sample_object能够创建,sample_object.Antibody也会返回None,因此sample_object.Antibody.Antibody_sequence不能返回name属性,因为None类型没有Antibody_sequence属性

我知道我可以在main方法中过滤出None,但是是否可以在类中定义如果sample_object.Antibodyis None,那么它们的返回属性也将是None,并且不会给出错误

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-27 13:47:27

您的类Sample有一个antibody属性,而不是Antibody属性,所以我假设sample_object.Antibody.Antibody_sequence是一个拼写错误,当我试图回答您的问题时,您的意思是sample_object.antibody.Antibody_sequence

具体地说(就像你在评论中所说的那样),当你遇到以下情况时:

代码语言:javascript
复制
sample_object.antibody == None

您需要:

代码语言:javascript
复制
sample_object.antibody.Antibody_sequence

不会导致错误(抛出异常),而是导致None

这是不可能的。让我来说明一下原因。行sample_object.antibody.Antibody_sequence可以等效地写成:

代码语言:javascript
复制
((sample_object).antibody).Antibody_sequence

所以(sample_object)是对Sample类的一个实例的引用。然后引用那个类,看看它是否有antibody属性。如果是,则返回该属性的值。因此,如果该属性值为None,那么您将拥有以下内容:

代码语言:javascript
复制
(None).Antibody_sequence

当然,None没有任何属性,因此此操作失败。这里重要的一点是,无论你在Sample中做了什么,你都不能影响你返回的None在返回之后所做的事情。所以,没有办法满足您的请求'sample_object.Antibody = None,但当我调用sample_object.Antibody.Antibody_sequence时,它不会出错,而只是说None‘

然而,这并不意味着你不能实现你想做的事情。你只需要使用一些而不是没有作为无效抗体初始化器。下面的代码应该可以实现你想要做的事情。

您可以专门创建一个类,以代替示例类中抗体的None初始值设定项。

代码语言:javascript
复制
class AntibodyNone():
    def __bool__(self):
        return False

    @property
    def Antibody_sequence(self):
        return None

a_none = AntibodyNone()

class Sample():
    def __init__(self, sample, antibody = None):
        self.sample = sample
        if antibody:
            self.antibody = antibody
        else:
            self.antibody = a_none

    def pass_in_sample(self, antibody):
        if antibody:
           self.antibody = antibody
        else:
            self.antibody = a_none


s = Sample("sample_val")

s.antibody.Antibody_sequence

在本例中,s.antibody是未初始化的,但您仍然可以通过它引用s.antibody.Antibody_sequence,并得到None而不是error。

你不能测试sample_object.antibody == None__bool__()给了这个类“Falsiness”。所以如果你测试if s.antibody,它将是假的。这就是如何在Python3中添加“Truthiness”到一个类中,如果你想在Python2中这样做,你需要添加__nonzero__()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62032987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档