python嵌套类

Daq*_*ker 17 python python-3.x

首先,这是我的测试代码,我使用的是python 3.2.x:

class account:
    def __init__(self):
        pass

    class bank:
        def __init__(self):
            self.balance = 100000

        def balance(self):
            self.balance

        def whitdraw(self, amount):
            self.balance -= amount

        def deposit(self, amount):
            self.balance += amount
Run Code Online (Sandbox Code Playgroud)

当我做:

a = account()
a.bank.balance
Run Code Online (Sandbox Code Playgroud)

我希望得到平衡值的回报,而不是我得到的功能"平衡",为什么会这样?我这样做时会返回余额值:

class bank:
    def __init__(self):
        self.balance = 100000

    def balance(self):
        self.balance

    def whitdraw(self, amount):
        self.balance -= amount

    def deposit(self, amount):
        self.balance += amount

a = bank()
a.balance
Run Code Online (Sandbox Code Playgroud)

所以我想知道为什么会这样,如果有人想出办法让我在嵌套版本中获得平衡价值,那就太棒了.

cod*_*ape 30

我的代码版本,带有注释:

#
# 1. CamelCasing for classes
#
class Account:
    def __init__(self):
        # 2. to refer to the inner class, you must use self.Bank
        # 3. no need to use an inner class here
        self.bank = self.Bank()

    class Bank:
        def __init__(self):
            self.balance = 100000

        # 4. in your original code, you had a method with the same name as 
        #    the attribute you set in the constructor. That meant that the 
        #    method was replaced with a value every time the constructor was 
        #    called. No need for a method to do a simple attribute lookup. This
        #    is Python, not Java.

        def withdraw(self, amount):
            self.balance -= amount

        def deposit(self, amount):
            self.balance += amount

a = Account()
print(a.bank.balance)
Run Code Online (Sandbox Code Playgroud)


NPE*_*NPE 9

有几个问题:

  1. 您正在使用balance数据成员和函数的名称.
  2. 你错过了一个return声明balance().
  3. balance()在一个实例上运行bank.在a.bank.balance这里没有实例:这里a.bank指的是内部类本身.