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

时间:2011-10-16 06:05:20

标签: python class methods

我有这个代码我正在尝试,当我在调用方法时将它们用作参数时,我无法弄清楚如何修改实例属性。

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

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

如何解决此问题?

4 个答案:

答案 0 :(得分:2)

  

此问题可能与此问题有关:Python:如何通过引用传递变量?

是。

  

如何解决此问题?

您需要传递一个可以修改的值并进行修改。数字无法修改: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即可完成此操作。

(不变'佣金'成本也是不切实际的;百分比更有意义。)

答案 1 :(得分:0)

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

如果您对传递自由格式字符串不满意,可以定义一些类变量,例如: refQtyA = "qtyA",并在调用您的函数时将它们用作参数:buy(p.refQtyA, 10, 25)

答案 2 :(得分:0)

@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

答案 3 :(得分:0)

我认为你应该重新设计你的课程。编写函数 buyA,buyB,buyC 并确保重用公共代码,或者将 buyA,buyB,buyC 重构为单个字典,该字典将使用单个函数进行更新购买由字符串索引。

只有当A,B和C在你的班级中有一些特殊的商业逻辑意义时,第一个提案才有意义。