在if语句中定义类的方法

时间:2016-11-30 21:24:36

标签: python python-2.7 oop

我正在尝试创建一个类,该类将根据输入创建具有不同方法的对象。这一点是为了避免每次调用方法时都使用if语句。

以下是我认为可行的代码,但无效。

class Food:
    def __init__(self,food_type):
        self.food_type = food_type

        if food_type == 'cookie':
            print 'this is a cookie'
            def is_awesome(self):
                print "is awesome"
        else:
            print 'this is not a cookie'
            def is_awesome(self):
                print "not awesome"

Oreo = Food('cookie')
Oreo.is_awesome()

代码在def is_awesome(self)语句中没有错误,而是Oreo.is_awesome()行引发了错误:

“AttributeError:食物实例没有属性is_awesome”。

有没有更好的方法用不同的方法制作对象?并且为什么方法is_awesome不能被'Oreo.is_awesome'调用?

3 个答案:

答案 0 :(得分:1)

有没有更好的方法用不同的方法制作对象?

是的,一种有效的方式:)多态性是一个很好的候选者。

class Food:
  def is_awesome(self):
    print 'not awesome'

class Cookie(Food):
  def is_awesome(self):
    print 'is awesome'

并且有没有理由为'Oreo.is_awesome'无法调用方法is_awesome?

是的,它没有绑定到任何

中的实例(通常称为self

答案 1 :(得分:0)

您必须定义方法/函数is_awesome(self),然后在其中定义if's

class Food:
    def __init__(self,food_type):
        self.food_type = food_type

    def is_awesome(self):
         if self.food_type == 'cookie':
            print 'this is a cookie'
            print "is awesome"
         else:
            print 'this is not a cookie not awesome'
            print "not awesome"


Oreo = Food('cookie')
Oreo.is_awesome()

这是有效的,经过测试!

答案 2 :(得分:0)

我遇到了类似的情况,我希望一个类的不同实例让其中一个方法根据 init 值的不同而表现不同,但仍然具有相同的方法名称,并且不想每次都运行 if/else 语句调用方法。

我发现的最简单的解决方案是定义一个 setter 方法,该方法创建一个指向所需行为的指针,并且这个 setter 方法仅在初始化时运行一次:

class Food:
    def __init__(self, food_type):
        self.food_type = food_type
        
        self.set_awesomeness()
    
    def is_awesome():
        return 'is awesome'

    def not_awesome():
        return 'not awesome'

    # Point to the wanted behavior
    def set_awesomeness(self):
        if self.food_type == 'cookie':
            self.awesomeness = Food.is_awesome()
        else:
            self.awesomeness = Food.not_awesome()

    def get_awesomeness(self):
        return self.awesomeness
    
cookie = Food('cookie')
cookie.get_awesomeness() # 'is awesome'

donut = Food('donut')
donut.get_awesomeness() # 'not awesome'