【发布时间】:2019-03-24 08:05:50
【问题描述】:
我正在尝试理解类结构。
该示例是带有__size 和__toppings_list 的披萨订单。
我可以很容易地传递尺寸,但它不会让我将浇头作为列表传递
我不断得到
size = small
toppings = small
无论我如何尝试调用 __string__ 打印功能,它都不会很好玩。
class Pizza:
def __init__(self, size = "small", topping_list = []):
self.__size = size
self.__topping_list = topping_list
def __string__(self):
string = "Size is" + self.__size + ' and Topping is ' + self.__topping_list
return string
def set_size(self, size):
self.__size = size
def get_size(self):
return self.__size
def set_topping(self, topping):
self.__topping_list
def get_topping(self):
return self.__size
def add_topping(self, topping):
self.__topping_list
def get_cost(self):
cost = 0
size = pizza.get_size()
toppings = pizza.get_topping()
totalToppings = len(toppings)
if size == "small":
cost += 10
elif size == "medium":
cost += 12
elif size == "large":
cost +=14
cost += totalToppings * 2
return cost
pizza = Pizza("small",["meat"])
size = pizza.get_size()
toppings = pizza.get_topping()
print(size)
print(toppings)
pizza_string = str(pizza)
print(pizza_string)
【问题讨论】:
-
def get_topping(self): return self.__size -
另见:stackoverflow.com/questions/1132941/…。
def set_topping(self, topping): self.__topping_list也不会做太多事情。 -
这里有很多问题需要解决:
print(value)将使用str(value),而str(value)又会查找__str__。__string__在该路径中不起作用。 Python 没有隐私模型,以双下划线开头的名称不会隐藏内部状态,只会重命名属性以避免与子类发生冲突。不要使用__开头的名称,除非您正在编写框架 API 以供第三方开发人员扩展。 -
Python 不需要使用 getter 和 setter,因为如果你发现你当时需要一个
@property,那么稍后更新一个类以使用@property是微不足道的,不像 Java,你以后不能进行该切换,因此始终在此处使用 setter 和 getter 是有意义的。不要尝试像使用 Java 一样使用 Python。如果您没有使用 getter 和 setter,那么您在这里遇到简单错误的可能性要小得多,您的get_toppinggetter 返回__size。 -
您的
__init__签名中的topping_list = []也有问题,该列表在所有实例之间共享>,请参阅"Least Astonishment" and the Mutable Default Argument。
标签: python string class private init