获取类的名称并将其包装在if语句中

时间:2014-04-22 15:38:30

标签: python django

我想在模型中检索一个类的名称。可以使用__class__魔法来实现。如何将其包装在if statement中,以便我为它们做一些必要的操作。

说,lst = [<mammal>, <fish>, <amphibian>, <mamaal>]然后

if <mammal>:
  # do this
elif <fish>:
  # do fish
else:
  # do other

我知道这不是一个很好的做事方式,但我想这是最佳拍摄方式。任何帮助将非常感激。谢谢!

2 个答案:

答案 0 :(得分:4)

我不确定你的用例是什么,但似乎你没有以最好的方式做到这一点。您应该将逻辑放入类中,而不是检查类型并为每个类型执行特定的操作:每个类应定义do_stuff方法,然后您只需调用animal.do_stuff()

答案 1 :(得分:3)

假设您从以下内容开始:

class Mammal:
    ...

class Amphibian: 
    ...

class Fish:
    ...

animals = [Mammal(), Amphibian(), Fish()]

您可以按照以下步骤过滤animals的处理:

for animal in animals:
    if isinstance(animal, Mammal):
        ...
    elif isinstance(animal, Fish):
        ...
    else:
        ...

isinstance支持继承,所以如果你有一个新的子类:

class Bat(Mammal):
    ...

然后

isinstance(Bat(), Mammal) == True

或者,更多的Pythonic("EAFP")方法是使用try来处理某些animal不支持你所做的事情的情况尝试用它们,例如:

for animal in animals:
    try:
        animal.fly(destination)
    except AttributeError:
        animal.walk(destination)

这样,如果你添加另一个新类:

class Bird:
    ...

只要新类实现fly和/或walk,您的代码仍然有效,无论它是否继承自您已经明确处理过的类。