📜  Python中的 __getitem__ 和 __setitem__

📅  最后修改于: 2022-05-13 01:54:58.432000             🧑  作者: Mango

Python中的 __getitem__ 和 __setitem__

Dunder 方法是双下划线方法,用于模拟内置类型的行为。它们是预定义的方法,可以简化可以在类实例上执行的许多操作,例如 __init__()、__str__()、__call__() 等。这些方法非常有用,因为它们用于二进制操作、赋值操作、一元和二进制比较操作。

注意:更多信息请参考Python中的 Dunder 或魔法方法

__getitem__ 和 __setitem__

作为这些神奇方法的一部分,有 getter 和 setter 方法。它们由__getitem__()__setitem__()方法实现。但是,这些方法只用于数组、字典、列表等索引属性中,而不是直接访问和操作类属性,它提供了这样的方法,因此这些属性只能通过自己的实例进行修改,从而实现抽象。

这些方法不是将类属性设为公共,而是将它们设为私有,提供验证,即只有正确的值被设置为属性,并且只有正确的调用者才能访问这些属性。

让我们以一个人的银行记录为例。它包含余额、交易历史和其他机密记录作为其中的一部分。现在,需要将此银行记录作为内置数据类型处理,以方便许多操作。有几种方法需要访问余额和交易历史记录。如果他们直接修改余额,他们最终可能会插入空值或非常脆弱的负值。因此, __getitem__()__setitem__()有助于安全地呈现细节。

例子:

class bank_record:
      
    def __init__(self, name):
          
        self.record = {
                        "name": name,
                        "balance": 100,
                        "transaction":[100]
                        }
  
    def __getitem__(self, key):
          
        return self.record[key]
  
    def __setitem__(self, key, newvalue):
          
        if key =="balance" and newvalue != None and newvalue>= 100:
            self.record[key] += newvalue
              
        elif key =="transaction" and newvalue != None:
            self.record[key].append(newvalue)
      
    def getBalance(self):
        return self.__getitem__("balance")
  
    def updateBalance(self, new_balance):
          
        self.__setitem__("balance", new_balance)
        self.__setitem__("transaction", new_balance)    
      
    def getTransactions(self):
        return self.__getitem__("transaction")
  
    def numTransactions(self):
        return len(self.record["transaction"])
  
sam = bank_record("Sam")
print("The balance is : "+str(sam.getBalance()))
  
sam.updateBalance(200)
print("The new balance is : "+str(sam.getBalance()))
print("The no. of transactions are: "+str(sam.numTransactions()))
  
sam.updateBalance(300)
print("The new balance is : "+str(sam.getBalance()))
print("The no. of transactions are: "+str(sam.numTransactions()))
print("The transaction history is: "+ str(sam.getTransactions()))

输出

The balance is : 100
The new balance is : 300
The no. of transactions are: 2
The new balance is : 600
The no. of transactions are: 3
The transaction history is: [100, 200, 300]

在这里你可以看到,实现numTransactions()getTransactions()getBalance()setBalance()是多么容易,只需实现__getitem__()__setitem__()方法。此外,它还负责验证余额和交易历史。