Python新手:尝试从列表中打印对象属性

时间:2019-09-22 17:28:13

标签: python

import ShoppingClass as SC
class ShoppingCartPrinter:
    shoppingCart = SC.ShoppingCart()
    while(True):
        item = SC.ItemToPurchase()
        item.setName(input('\nEnter Name: '))
        item.setDescription(input('\nSet Description: '))
        item.setPrice(input('\nSet price: '))
        item.setQuantity(input('\nSet Quantity: '))

        shoppingCart.addItem(item)

        for shoppingCart.cartItems.getName() in shoppingCart.cartItems:
            print(shoppingCart.cartItems.getName())

我正在尝试自学来自Java的python并编写了此简单程序。我还有另一个用于创建对象“项目”和“购物车”的类。在购物车的构造函数中,我创建一个空列表,向其中添加对象。如果我尝试打印对象的属性,我不知道语法应该如何。我上面的内容显然是错误的。 抱歉,如果这是一个简单的答案,请提供帮助。 谢谢

class ItemToPurchase:
    def __init__(self,itemName ='none',itemDescription = 'none',itemPrice = 
0,itemQuantity = 0):
    self.itemName = itemName
    self.itemDescription = itemDescription
    self.itemPrice = itemPrice
    self.itemQuantity = itemQuantity

def setName(self,newName):
    self.itemName = newName

def getName(self):
    return self.itemName

def setPrice(self, newPrice):
    self.itemPrice = newPrice

def getPrice(self):
    return self.itemPrice

def setQuantity(self, newQuantity):
    self.itemQuantity = newQuantity

def getQuantity(self):
    return self.itemQuantity

def setDescription(self,description):
    self.itemDescription = description

def getDescription(self):
    return self.itemDescription

def printItemCost():
    print(itemName+" "+itemQuantity+" @ $"+itemPrice+" = 
"+itemPrice*itemQuantity)

def printItemDescription():
    print(itemName+" "+itemDescription)


class ShoppingCart:
    def __init__(self,customerName = 'none', currentDate = 'January 1, 2016'):
        self.customerName = customerName
        self.currentDate = currentDate
        self.cartItems = []

    def addItem(self, item):
        self.cartItems.append(item)

    def getDate(self):
        return self.currentDate

    def getCustomerName(self):
        return self.customerName

3 个答案:

答案 0 :(得分:2)

我肯定不能不见其他同学就说什么。但是我认为问题可能是由建设者引起的。我看到的是您没有将任何值传递给构造函数,而是尝试使用setter函数设置其属性。如果您希望其他人分配它,请执行以下操作:

name = input("Enter name")
description = input("Enter description")
item = foo(name, description)

使用这种模式来分配其他用户键入的变量。 对于印刷部分,请使用它。

for i in shoppingCart.cartItems:
    print(i.getName())

如有任何疑问,请随时提问。希望对您有所帮助:)

PS:更新时,我正在写我的答案。我的答案仍然很重要。我认为您过于复杂了。

答案 1 :(得分:0)

您发布的代码有很多错误之处,但是您打印项目的循环应如下所示:

titles = [i['title'] for i in soup.select("a:has(img) + [href*='/title/tt'][title]")]

答案 2 :(得分:0)

代码的一个问题是在ItemToPurchase类中过多使用了setter函数。最好使用构造函数设置值? Java课程通常会教您需要为所有属性构建getter和setter,但这不是最好的主意,并且会使代码变得肿。只有在绝对需要时才应实施它们(在您的情况下,只需要更改itemQuantity,也许还需要更改coupon的itemPrice或类似的价格)。此外,在Python中,您可以返回所有ItemToPurchase属性的元组,而不是具有单个getter:

def getAttributes(self):
    return (self.itemName, self.itemDescription, self.itemPrice, self.itemQuantity)

然后,您不需要在主类/ main函数中返回所有这些访问,只需分配给局部变量并以这种方式构造ItemToPurchase。这样一来,类访问/函​​数调用就会减少很多,这要干净得多。

另一个问题是ShoppingCart的构造方式。尽管Python并不完全具有Java或C ++之类的'private'属性,但您可能希望在该类的__init___中将cartItems列表设为“ private”(有错,但足够接近),并构建一个检索器:

    self.__cartItems = []

def getCartSize():
    return len(self.__cartItems)

def getCartItem(pos):
    return self.__cartItems[pos].getAttributes()

然后恢复ShoppingCart中第一个ItemToPurchase的属性:

myItem = getCartItem(0)  #returns a tuple of all the data about that ItemToPurchase
print(myItem[0])         #prints the name of that item in the cart

Python类和Java类之间最大的区别可能是“私有”概念的实现方式以及Python返回语句的更大灵活性。