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

时间:2020-05-26 23:21:01

标签: python-3.x

这个例子可能不是很好,但是原始代码更加混乱,所以我尝试一个简化版本 所以我有两节课

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文件,并且存在一些样本,但是没有抗体

我正在尝试执行以下操作

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无法返回名称属性,因为None类型不具有Antibody_sequence属性

我知道我可以在main方法中过滤掉None,但是无论如何在类中定义了如果sample_object.Antibody为None,那么它们的return属性也将为None,并且不会给出错误

谢谢

1 个答案:

答案 0 :(得分:1)

您的课程Sample具有属性antibody而不是Antibody,因此我将假设sample_object.Antibody.Antibody_sequence是一个错字,而您的意思是sample_object.antibody.Antibody_sequence为我试着回答你的问题。

要具体说明(如您在评论中所做的那样),当您遇到以下情况时:

sample_object.antibody == None

您要

sample_object.antibody.Antibody_sequence

不引起错误(引发异常),而是导致None

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

((sample_object).antibody).Antibody_sequence

因此(sample_object)是对Sample类实例的引用。然后,您引用该类,并查看它是否具有属性antibody。如果这样做,则返回属性的值。因此,如果该属性值为None,那么您拥有的是这样:

(None).Antibody_sequence

当然,None没有任何属性,因此失败。这里的重点是,无论您在Sample内做什么,都不会影响返回的None在返回之后会做什么。因此,没有办法满足您的要求“ sample_object.Antibody = None”,但是当我调用sample_object.Antibody.Antibody_sequence时,它不会出错,而只是说“ None”。

但是,这并不意味着您无法实现自己想做的事情。您只需要使用某些东西代替None作为空抗体初始化程序即可。下面的代码应该可以实现您想要做的事情。

您可以创建一个专门用于在Sample类中代替抗体的None初始化程序的类。

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而不是错误。

您无法测试sample_object.antibody == None__bool__()的类别为“虚假”。因此,如果您测试if s.antibody,它将为False。这就是在python 3中的类中添加“真实性”的方式,如果要在python 2中这样做,则需要添加__nonzero__()