我有四个类,我试图将我的肉值,米值和豆值传递给它们各自的类,并通过Burrito
类返回它们的值。我已经为此奋斗了两天,但没有明显的进展,任何关于该怎么做的想法,对于任何语法错误表示歉意。
class Meat:
def __init__(self, value=False):
self.set_value(value)
def get_value(self):
return self.value
def set_value(self, value):
if value in ["chicken", "pork", "steak", "tofu"]:
self.value = value
else:
self.value = False
class Rice:
def __init__(self, value=False):
self.set_value(value)
def get_value(self):
return self.value
def set_value(self, value):
if value in ["brown", "white"]:
self.value = value
else:
self.value = False
class Beans:
def __init__(self, value=False):
self.set_value(value)
def get_value(self):
return self.value
def set_value(self, value):
if value in ["black", "pinto"]:
self.value = value
else:
self.value = False
这里是类是我假设传入值从和返回值。
class Burrito:
def __init__ (self, meat, to_go, rice, beans):
self.meat = Meat(meat)
self.set_to_go(to_go)
self.rice = Rice(rice)
self.beans = Beans(beans)
def set_meat(self, meat):
self.set_value(meat)
def set_to_go(self, to_go):
to_go_list = [True, False]
if to_go in to_go_list:
self.to_go = to_go
else:
self.to_go = False
def set_rice(self, rice):
self.set_value(rice)
def set_beans(self, beans):
self.set_value(beans)
def get_meat(self):
self.meat_v = Meat()
return self.meat_v.value
def get_to_go(self):
return self.to_go
def get_rice(self):
self.rice_v = Rice()
return self.rice_v.value
def get_beans(self):
self.beans_v = Beans()
return self.beans_v.value
这里是我用来测试我的代码的行:
newburrito = Burrito("pork", True, "brown", "pinto")
print (newburrito.meat)
这是错误线我得到:
<__main__.Meat object at 0x7fa5ad8bccf8>
我期待它打印
pork
首先,你没有得到一个错误。你在对象肉上调用 print,这就是发生的事情,print 显示对象是类Meat
,它还显示了这个实例在内存中的地址。
如果要打印存储在Meat
类实例中的属性value
上的值,则必须执行print(newburrito.meat.get_value())
,因为它已经在注释中指出。
本练习是关于 Python 属性的。如果您期望newburrito.meat
返回"pork"
,这意味着meat
是类Burrito
的属性,不是方法,也不是类实例,这是您的代码定义它的方式。
步骤 1。使类成员meat,to go,beans和rice私有。约定是以下划线开头的名称:
class Burrito:
def __init__ (self, meat, to_go, rice, beans):
self._meat = Meat(meat)
self._to_go = to_go
self._rice = Rice(rice)
self._beans = Beans(beans)
步骤 2:定义属性以返回肉,去,豆和米。为此,您需要一个 getter 方法(使用 decorator@property
)和一个 setter 方法(使用 decorator@xx.setter
获取2.
class Burrito:
# ... continued ...
@property
def meat(self):
return self._meat.get_value()
@meat.setter
def meat(self,value):
self._meat.set_value(value)
@property
def to_go(self):
return self._to_go
@to_go.setter
def to_go(self,value):
self._to_go = isinstance(value,bool) and value
@property
def rice(self):
return self._rice.get_value()
@rice.setter
def rice(self,value):
self._rice.set_value(value)
@property
def beans(self):
return self._beans.get_value()
@beans.setter
def beans(self, value):
self._beans.set_value(value)
然后,您可以使用属性.meat
,.rice
等,就好像它们是Burrito
的实例变量一样,但是当您将它们用作 r 值时,解释器调用 getter 方法,当您将它们用作 l 值时,解释器调用 setter 方法。
你可以看到它是如何工作的:
newburrito = Burrito("pork", True, "brown", "pinto")
print (newburrito.meat)
print (newburrito.rice)
print (newburrito.beans)
print (newburrito.to_go)
newburrito.meat = 'tofu'
print (newburrito.meat)
输出为
pork
brown
pinto
True
tofu
感谢大家的努力,我感谢我从你的代码中得到的所有指针。
class Meat:
def __init__(self, value=False):
self.set_value(value)
def get_value(self):
return self.value
def set_value(self, value):
if value in ["chicken", "pork", "steak", "tofu"]:
self.value = value
else:
self.value = False
class Rice:
def __init__(self, value=False):
self.set_value(value)
def get_value(self):
return self.value
def set_value(self, value):
if value in ["brown", "white"]:
self.value = value
else:
self.value = False
class Beans:
def __init__(self, value=False):
self.set_value(value)
def get_value(self):
return self.value
def set_value(self, value):
if value in ["black", "pinto"]:
self.value = value
else:
self.value = False
我的工作卷饼类:
class Burrito:
def __init__ (self, meat, to_go, rice, beans, extra_meat = False, guacamole = False, cheese = False, pico = False, corn = False):
self.meat = Meat(meat)
self.set_to_go(to_go)
self.rice = Rice(rice)
self.beans = Beans(beans)
self.set_extra_meat(extra_meat)
self.set_guacamole(guacamole)
self.set_cheese(cheese)
self.set_pico(pico)
self.set_corn(corn)
def set_meat(self, meat):
self.meat.set_value(meat)
def set_to_go(self, to_go):
to_go_list = [True, False]
if to_go in to_go_list:
self.to_go = to_go
else:
self.to_go = False
def set_rice(self, rice):
self.rice.set_value(rice)
def set_beans(self, beans):
self.beans.set_value(beans)
def set_extra_meat(self, extra_meat):
extra_meat_list = [True, False]
if extra_meat in extra_meat_list:
self.extra_meat = extra_meat
else:
self.extra_meat = False
def set_guacamole(self, guacamole):
guacamole_list = [True, False]
if guacamole in guacamole_list:
self.guacamole = guacamole
else:
self.guacamole = False
def set_cheese(self, cheese):
cheese_list = [True, False]
if cheese in cheese_list:
self.cheese = cheese
else:
self.cheese = False
def set_pico(self, pico):
pico_list = [True, False]
if pico in pico_list:
self.pico = pico
else:
self.pico = False
def set_corn(self, corn):
corn_list = [True, False]
if corn in corn_list:
self.corn = corn
else:
self.corn = False
def get_cost(self):
cost = 5
if self.meat.get_value() == "chicken" or self.meat.get_value() == "pork" or self.meat.get_value() == "tofu":
cost += 1
if self.meat.get_value() == "steak":
cost += 1.50
if self.extra_meat == True and not self.meat.get_value() == False:
cost += 1
if self.guacamole == True:
cost += 0.75
return cost
def get_meat(self):
return self.meat.get_value()
def get_to_go(self):
return self.to_go
def get_rice(self):
return self.rice.get_value()
def get_beans(self):
return self.beans.get_value()
def get_extra_meat(self):
return self.extra_meat
def get_guacamole(self):
return self.guacamole
def get_cheese(self):
return self.cheese
def get_pico(self):
return self.pico
def get_corn(self):
return self.corn
为了使 Burrito 类的肉,米饭和豆类实例与上面的三个类进行通信,我需要将它们的类 getter 和 setter 调用到 Burrito 类 getter 和 setter 中。例如,将肉实例从 Burrito 类发送到 Meat 类,我只需为 Burrito 中的 meat 方法编写 setter,如下所示:
def set_meat(self, meat):
self.meat.set_value(meat)
如上面的墨西哥卷饼类所示。同样适用于豆类和大米。
现在要从它们回调值,我只是将它们各自的类 getter 调用到我的 Burrito 类 getter 中。
def get_meat(self):
return self.meat.get_value()
同样适用于大米和豆类类,如上面的墨西哥卷饼类所示:
对于好奇的人来说,这是一个测试它的小方法:
newburrito = Burrito("pork", True, "brown", "pinto", True, True)
print (newburrito.meat.get_value())
再次感谢并为任何语法错误道歉。我希望我的解释足够清楚。请注意,我决定发布我的整个代码,以保持清晰,而不是当我问我的问题时发布的选择代码。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(31条)