我正在尝试创建一个类,该类将根据输入创建具有不同方法的对象。这一点是为了避免每次调用方法时都使用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'调用?
答案 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'