使用实例属性作为方法的参数

2024-06-16 10:43:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这段代码,我正在尝试,我不知道如何修改实例属性,当我使用它们作为参数时,调用一个方法。你知道吗

class Portfolio(object):
    def __init__(self):
        self.qtyA = 50
        self.qtyB = 0
        self.qtyC = 0
        self.cash = 0  

    def __str__(self):
        return ("%d %d %d %.2f")%(self.qtyA, self.qtyB, self.qtyC, self.cash)

    def buy(self, stockQty, qtyToBuy, price, commission=20):
        stockQty += qtyToBuy
        print stockQty
        buyTransaction = price * qtyToBuy
        self.cash -= buyTransaction + commission

>>> p = Portfolio()
>>> p.buy(p.qtyA,10,25)
60
>>> print p
50 0 0 -270.00

当调用buy时,一个新变量stockQty正在被创建。我希望传递对属性qtyA的引用,而不是值。此问题可能与以下问题有关:How do I pass a variable by reference?

如何解决这个问题?你知道吗


Tags: self属性defbuycashpriceprintportfolio
3条回答

@vhallac所述,您可以使用setattrgetattr方法分别设置和获取属性值。实际上,您不需要将object属性传递给函数。您可以在函数中直接访问它并进行更新:

def buy(self, qtyToBuy, price, commission=20):
    self.qtyA += qtyToBuy
    print self.qtyA
    buyTransaction = price * qtyToBuy
    self.cash -= buyTransaction + commission
>>> p = Portfolio()
>>> p.buy(10,25)
>>> print p
60 0 0 -270.00

This problem might be related to this question: Python: How do I pass a variable by reference?

是的。你知道吗

How can I work around this issue?

您需要传递一个可以修改的值,然后修改它。不能修改数字:a可以从引用23改为引用42,但不能使23变为42,反之亦然。你知道吗

在你的例子中,做这件事的自然方法是注意到你正在做的另一件愚蠢的事情——并行使用一堆相关的、类似名称的变量——并通过用序列替换它们来解决这个问题。list类型是一个可修改的序列。您需要传递列表本身,而不仅仅是一个数字量,并指示要替换列表中的哪个元素。但实际上不需要传递列表,因为它已经是self的一部分。你知道吗

class Portfolio(object):
    def __init__(self):
        self.quantity = [50, 0, 0]
        self.cash = 0  

    def __str__(self):
        return ("%d %d %d %.2f")%(self.quantity[0], self.quantity[1], self.quantity[2], self.cash)

    def buy(self, stockToBuy, amountToBuy, price, commission=20):
        self.quantity[stockToBuy] += amountToBuy
        cost = price * amountToBuy
        self.cash -= cost + commission

对于更灵活的解决方案,您可以考虑在股票名称和股票数量之间建立关联——毕竟,谁知道客户将来可能想要什么股票。我们可以简单地用dict来代替。你知道吗

(固定的‘佣金’成本也是不现实的;百分比更有意义。)

一种简单的方法是将字符串作为stockQty传递,其中包含要修改的成员的名称(例如“qtyA”),并使用getattr(self, stockQty)读取和setattr(self, stockQty, newVal)更改此参数的值。你知道吗

如果您不喜欢传入自由格式字符串,可以定义一些类变量,例如refQtyA = "qtyA",并在调用函数时将它们用作参数:buy(p.refQtyA, 10, 25)。你知道吗

相关问题 更多 >