这个示例可能不是很好,但原始代码更令人困惑,所以我尝试了简化版本,因此我有两个类
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.Antibodyis None,那么它们的返回属性也将是None,并且不会给出错误
谢谢
发布于 2020-05-27 13:47:27
您的类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初始值设定项。
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__()。
https://stackoverflow.com/questions/62032987
复制相似问题