from typing import List
class ShoppingCart:
def __init__(self,items: List[str]):# List[str]是一个类型提示,告诉Python程序员(和某些工具)这个参数应该是一个包含字符串的列表
self.items = items
def __add__(self,another_cart):
new_cart = ShoppingCart(self.items+another_cart.items)
return new_cart
cart1 = ShoppingCart(["apple","banana"])
cart2 = ShoppingCart(["eggplant","watermelon"])
new_cart = cart1 + cart2
from typing import List 是 Python 中用于类型注解的一部分,它来自于 Python 的 typing 模块。这个模块提供了一系列的标准类型注解,旨在帮助开发者在编写代码时明确变量的预期类型,从而提高代码的可读性和健壮性。
在 Python 中,尝试使用 + 操作符对两个对象进行操作时,Python 会查找这两个对象的 __add__ 方法 。Python 会自动调用 cart1 的 __add__ 方法,并将 cart2 作为参数传递给它。然后,__add__ 方法会返回一个新的 ShoppingCart 实例,该实例包含了 cart1 和 cart2 中所有商品的合并列表。
接着想打印输出new_cart查看购物车内容,得到一串内存地址
如何解决? 在类中定义一个__str__方法。它定义了当对象被转换为字符串时应该返回什么。这通常发生在使用 print() 函数、字符串格式化(如使用 str.format() 或 f-strings)或将对象直接传递给需要字符串参数的函数时。
def __str__(self):
return f'Cart({self.items})'
当 print(new_cart) 被调用时,print() 函数需要将其参数转换为一个字符串以便输出。由于 new_cart 是一个 ShoppingCart 类的实例,Python 会查找该类的 __str__ 方法(如果已定义)来执行这个转换。
__str__ 方法返回了一个f-string,该f-string将 self.items 列表转换为了一个字符串表示,并将其嵌入到 'Cart(...)' 模板中。
print(new_cart)
#输出:Cart(['apple','banana'eggplant''watermelon'])
当你想查看购物车中有多少东西
def __len__(self):
return len(self.items)
# ...
print(len(new_cart))
# 4
希望像调用函数那样调用实例:
#..
def __call__(self,item):
self.items.append(item)
cart1 = ShoppingCart(["apple","banana"])
cart2 = ShoppingCart(["eggplant","watermelon"])
new_cart = cart1 + cart2
new_cart('orange') #通过__call__实现 往购物车中加了一个橘子
print(len(new_cart))
# 5