首页 > 解决方案 > 即使对象是 None 类型也返回属性

问题描述

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

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不能返回name属性,因为None类型没有Antibody_sequence的属性

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

谢谢

标签: python-3.x

解决方案


你的班级Sample有一个属性antibodynot 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__()给出了“Falsiness”类。所以如果你测试if s.antibody它会是假的。这就是你如何在 python 3 的类中添加“Truthiness”,如果你想为 python 2 做这件事,你需要添加__nonzero__().


推荐阅读