这个例子可能不是很好,但是原始代码更加混乱,所以我尝试一个简化版本 所以我有两节课
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,并且不会给出错误
谢谢
答案 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__()
。