我正在努力解决数据库关系和Django的问题,但是为了达到重点,已经大大简化了我的案例。
我有以下课程:
class Car(object):
owner = 'No owner'
def get_owner(self):
return self.owner
如果我不实例化Car,但是将nissan设置为None,然后调用get_owner,则会出现以下错误:
nissan = None
nissan.get_owner()
AttributeError. 'NoneType' object has no attribute 'get_owner'
如果nissan为None,是否可以在调用nissan.get_owner()时返回None?
更大的图景:我正在编写一个Django templatetag,它根据是否存在数据库关系返回一些数据。不过,最好一行一行地编写这样的代码。最后,我只想从get_owner()或不获取任何值。
nissan.get_owner() or None
不在这里工作...
答案 0 :(得分:2)
简短的回答:不,您不应该在None
对象上调用方法,我相信您误解了对象创建的工作原理。如果您只想返回一个None
值,则不要首先分配它。声明统一属性的正确方法是:
class Car(object):
def __init__(self):
self.owner = None
并使用它:
nissan = Car()
nissan.owner
=> None
nissan.owner = 'Some Guy'
nissan.owner
=> 'Some Guy'
还要注意,get
方法在Python中不受欢迎,只需直接访问属性即可。
现在开始看大图-在澄清了对象创建的工作原理之后,您可以在使用对象之前测试该对象是否不为空:
nissan.owner if nissan is not None else None
答案 1 :(得分:1)
getattr()
应该会为您提供帮助。
getattr(nissan, 'owner', None)
此外,您不需要get_owner()
方法-python方法是直接访问属性。查找有关property()
的信息。
干杯!
答案 2 :(得分:0)
直接看大图,普通的python逻辑运算符可以为您提供帮助,and会在第一个False处停止。这样就可以了:
nissan and nissan.get_owner() or None
答案 3 :(得分:0)
如果Nissan为None,则它没有名为“ get_owner”的方法,这意味着您不能在nissan对象上(或该情况下的任何方法)调用此方法。 您需要使日产汽车成为一辆汽车,然后决定在哪种情况下get_owner方法将不返回任何值,并在您的代码中实现