python之__getitem__ 方法

前言

如果在类中定义了__getitem__()方法,那么他的实例对象(假设为P)就可以这样P[key]取值。

当实例对象做P[key]运算时,就会调用类中的__getitem__()方法。

示例1

实例对象的key不管是否存在都会调用类中的__getitem__()方法。而且返回值就是__getitem__()方法中规定的return值。

# -*- coding:utf-8 -*-
class DataTest:
    def __init__(self,id,address):
        self.id=id
        self.address=address
        self.d={self.id:1,
                self.address:"192.168.1.1"
                }
        
    def __getitem__(self,key):
        return "hello"
    
 
data=DataTest(1,"192.168.2.11")
print data[2] 

运行结果:

hello

示例2:利用P['k']方式获取实例对象的属性

A类的实例A()可以通过点的方式获取到属性【类的实例对象属性是构造方法中的初始化实例对象的属性】:

class A(object):

    count = 0

    def __init__(self):
        self.name = "gogo"
        self.age = 18

    def start(self):
        print("start1111111")

a = A()
print(a.count)
print(a.name)

如果想实现a['name']这种方式取值,在类中定义 __getitem__() 方法就可以实现:

class A(object):

    count = 0

    def __init__(self):
        self.name = "gogo"
        self.age = 18

    def start(self):
        print("start1111111")

    def __getitem__(self, item):
        return object.__getattribute__(self, item)

# 通过实例对象.属性获取属性
a = A()
print(a.count)
print(a.name)

# 通过[key]语法调用属性
print(a['count'])
print(a['age'])
print(a['start'])
print(a['start']())

运行结果:

0
gogo
0
18
<bound method A.start of <__main__.A object at 0x0000027CC08D96D8>>
start1111111
None

示例三:[Python的魔法方法__getitem__ 可以让对象实现迭代功能:即将实例对象转换为可迭代对象]

Python的魔法方法 __getitem__() 可以让对象实现迭代功能,这样就可以使用for...in... 来迭代该对象了

class Animal:
    def __init__(self, animal_list):
        self.animals_name = animal_list

animals = Animal(["dog","cat","fish"])
for animal in animals:
    print(animal)

在用 for..in.. 迭代对象时,如果对象没有实现 __iter__ ,__next__ 迭代器协议,Python的解释器就会去寻找__getitem__ 来迭代对象,如果连__getitem__ 都没有定义,这解释器就会报对象不是迭代器的错误:

TypeError: 'Animal' object is not iterable

而实现这个方法后,就可以正常迭代对象了。

class Animal:
    def __init__(self, animal_list):
        self.animals_name = animal_list

    def __getitem__(self, index):
        return self.animals_name[index]


animals = Animal(["dog", "cat", "fish"])
for animal in animals:
    print(animal)

a = Animal(["dog", "cat", "fish"])[0]
b = Animal(["dog", "cat", "fish"])[1]
c = Animal(["dog", "cat", "fish"])[2]
print('\n')
print(a, b, c, sep='\n')

运行结果:

dog
cat
fish

dog
cat
fish

 

posted @ 2021-09-15 10:28  习久性成  阅读(511)  评论(0编辑  收藏  举报