python-3.x - 即使对象是 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,并且不会给出错误
谢谢
解决方案
你的班级Sample
有一个属性antibody
not 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__()
.
推荐阅读
- mips - 在多周期中实现跳转寄存器(jr、sll、slti)
- node.js - ffmpeg:当输入缩放到某些尺寸时,xstack 不起作用
- python - 是否可以在 django 中为选择字段提供外部文件输入?
- windows - Informatica 管理控制台不会出现
- python - 我可以将 x 轴标记为 matplotlib 中的希腊字母 \rho 吗?
- ios - 使用 Cmd + Tab 打开多个程序 (Mac)
- node.js - Mongoose 不可设置的属性
- qnamaker - MS 团队 2.0.10 作为频道不能支持多回合
- python - 尝试使用 GEKKO 解决这个非线性优化,得到这个错误
- python - 在 oop python 中使用 Tkinter 主题