我是Python的新手。尝试使以下代码正常工作:
class Portfolio:
def __init__(self, balance={}):
self.__balance = balance.copy()
def initSym(self, sym):
if not sym in self.__balance:
self.__balance[sym] = 0
def invest(self, amt, fx):
initSym(fx)
self.__balance[fx] += amt
def divest(self, amt, fx):
initSym(fx)
self.__balance[fx] -= amt
def getBalance(self, fx):
initSym(fx)
return self.__balance[fx]
wallets = {'Paul':Portfolio({}),'Anne':Portfolio({'USD':200}),'John':Portfolio({'CHF':500,'GBP':11000})}
wallets['Anne'].getBalance('CHF')
但这会导致错误:
NameError: name 'initSym' is not defined
答案 0 :(得分:5)
如果您习惯使用C或Java,这可能对您来说很奇怪,因为您正试图从该类的其他方法之一中调用该类的方法,并且该方法不起作用。
Python处理它的方式有点奇怪。每个类方法实际上只是绑定到该类的一个独立方法,它以该类的一个实例作为其第一个参数。结果,如果您想从某个类的方法中使用该类的其他方法之一,则不要这样做
initSym(fx)
你必须做
self.initSym(fx)
答案 1 :(得分:2)
您需要在此类的self
def getBalance(self, fx):
self.initSym(fx)
return self.__balance[fx]
答案 2 :(得分:1)
如果方法是类的组成部分,则必须使用类实例的名称(class_instance.method
)对它们进行限定。如果引用来自同一类的另一种方法,则必须使用 self (self.method_name
)来对其进行限定:
class Portfolio:
def __init__(self, balance={}):
self.__balance = balance.copy()
def initSym(self, sym):
if not sym in self.__balance:
self.__balance[sym] = 0
def invest(self, amt, fx):
self.initSym(fx)
self.__balance[fx] += amt
def divest(self, amt, fx):
self.initSym(fx)
self.__balance[fx] -= amt
def getBalance(self, fx):
self.initSym(fx)
return self.__balance[fx]
wallets = {'Paul':Portfolio({}),'Anne':Portfolio({'USD':200}),'John':Portfolio({'CHF':500,'GBP':11000})}
wallets['Anne'].getBalance('CHF')
答案 3 :(得分:0)
您必须使用self.initSym
。这是对代码的修改:
class Portfolio:
def __init__(self, balance={}):
self.__balance = balance.copy()
def initSym(self, sym):
if not sym in self.__balance:
self.__balance[sym] = 0
def invest(self, amt, fx):
self.initSym(fx)
self.__balance[fx] += amt
def divest(self, amt, fx):
self.initSym(fx)
self.__balance[fx] -= amt
def getBalance(self, fx):
self.initSym(fx)
return self.__balance[fx]
wallets = {'Paul':Portfolio({}),'Anne':Portfolio({'USD':200}),'John':Portfolio({'CHF':500,'GBP':11000})}
wallets['Anne'].getBalance('CHF')
Here是关于著名的self
参数的解释。