【问题标题】:Passing a list to a class __init__将列表传递给类 __init__
【发布时间】: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_topping getter 返回 __size
  • 您的__init__ 签名中的topping_list = [] 也有问题,该列表在所有实例之间共享​​>,请参阅"Least Astonishment" and the Mutable Default Argument

标签: python string class private init


【解决方案1】:

您的代码中有很多奇怪的小事情。

首先,修复 get_topping 方法(如 cmets 中所指出的),重新创建您的实例,它会工作 - 这是为了解决您的主要问题。

小事,但强烈推荐:

  • 使用 [empty] 列表作为默认参数不是一个好主意,除非您知道自己在做什么。列表是可变的,参数被“绑定”到函数对象。因此,更改该默认值一次将影响所有后续调用。

  • 您尝试使用 __string__ 实现的目标在实现 __str__ 时看起来像是错误

  • 请在使用__attr 时三思(或更多)。如果您对 Java 等语言有经验,这可能看起来是个好主意,但在 python 中,以这种方式“隐藏”属性通常是个坏主意。这仍然可供用户使用,同时使您的类难以继承——而且使用非协作类并不有趣。如果您想识别非公共接口 — 考虑使用单下划线 (_size)。如果您不确定这是否应该公开,请公开。您始终可以在不破坏界面的情况下使其成为@property。同样适用于get_... 方法——如果你在没有属性的情况下检索属性,那么有这样的代码是没有意义的。只需拥有self.size 属性并使用它就可以了。如果您 100% 确定您不想在实例化后使其可编辑,那么就让它

    def __init__(...):
        self._size = ...
    @property
    def size(self):
        return self._size
    

【讨论】:

  • TY :-) .. 我要去阅读@property .. 并与我的大学讲师聊一聊 ;-) 关于这里的专业反馈 .. 我在 5 中学到了更多与你的时间比上周覆盖 Python 课程的时间要多
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
  • 2011-11-29
  • 2019-11-16
  • 1970-01-01
  • 2020-01-09
相关资源
最近更新 更多