由于无法识别动作名称而收到错误

时间:2019-02-23 20:22:52

标签: python

我是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

4 个答案:

答案 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参数的解释。