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__()
方法。此外,它还负责验证余额和交易历史。