调用类方法或返回无

时间:2018-08-15 13:31:11

标签: python django

我正在努力解决数据库关系和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

不在这里工作...

4 个答案:

答案 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方法将不返回任何值,并在您的代码中实现