我有这个代码我正在尝试,当我在调用方法时将它们用作参数时,我无法弄清楚如何修改实例属性。
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?
如何解决此问题?
答案 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
所述,您可以使用setattr
或getattr
方法分别设置和获取属性值。实际上,您不需要将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在你的班级中有一些特殊的商业逻辑意义时,第一个提案才有意义。