DEV Community

Super Kai (Kazuya Ito)
Super Kai (Kazuya Ito)

Posted on

__getitem__ & __setitem__ in Python (1)

Buy Me a Coffee

*Memos:

__getitem__() is the special(magic) method which can make its class object subscriptable and iterable to get a value as shown below:

*Memos:

  • The 1st parameter is self(Required). *self can be other name.
  • The 2nd parameter and 1st argument are key(Required): *Memos:
    • It can be any types.
    • key can be other name.
class MyCls:    
    def __getitem__(self, key):
        return key

v = MyCls()

print(v)
# <__main__.MyCls object at 0x0000021AF5C71640>

print(v[0], v[1], v[2], v[3], v[4])
print(v.__getitem__(key=0), v.__getitem__(key=1), v.__getitem__(key=2),
      v.__getitem__(key=3), v.__getitem__(key=4))
# 0 1 2 3 4

print(v[1:3])
print(v.__getitem__(key=slice(1, 3)))
# slice(1, 3, None)

print(v[:])
print(v.__getitem__(key=slice(None)))
# slice(None, None, None)

print(v[2.3], v[2.3+4.5j], v[True], v['a'], v[None])
print(v.__getitem__(key=2.3), v.__getitem__(key=2.3+4.5j),
      v.__getitem__(key=True), v.__getitem__(key='a'),
      v.__getitem__(key=None))
# 2.3 (2.3+4.5j) True a None

print(v[[2, 3]], v[(2, 3)], v[{2, 3}], v[{'a':'b'}])
print(v.__getitem__(key=[2, 3]), v.__getitem__(key=(2, 3)),
      v.__getitem__(key={2, 3}), v.__getitem__(key={'a':'b'}))
# [2, 3] (2, 3) {2, 3} {'a': 'b'}

for x in v:    # It breaks when x is 5
    if x == 5: # otherwise infinity loop occurs.
        break
    print(x)
# 0
# 1
# 2
# 3
# 4

v[0] = 'a'
v[1:3] = ['a', 'b', 'c', 'd', 'e']
# TypeError: 'MyCls' object does not support item assignment

v.__setitem__(key=0, value='a')
v.__setitem__(key=slice(1, 3), value=['a', 'b', 'c', 'd', 'e'])
# AttributeError: 'MyCls' object has no attribute '__setitem__'
Enter fullscreen mode Exit fullscreen mode

__setitem__() is the special(magic) method which can make its class object assignable to set a value as shown below:

*Memos:

  • The 1st parameter is self(Required). *self can be other name.
  • The 2nd parameter and 1st argument are key(Required): *Memos:
    • It can be any types.
    • key can be other name.
  • The 3rd parameter and 2nd argument are value(Required): *Memos:
    • It can be any types.
    • value can be other name.
class MyCls:    
    def __setitem__(self, key, value):
        print(key, value)

v = MyCls()

print(v)
# <__main__.MyCls object at 0x0000025540688950>

v[0] = 'a'
v.__setitem__(key=0, value='a')
# 0 a

v[1] = 'b'
v.__setitem__(key=1, value='b')
# 1 b

v[2] = 'c'
v.__setitem__(key=2, value='c')
# 2 c

v[3] = 'd'
v.__setitem__(key=3, value='d')
# 3 d

v[4] = 'e'
v.__setitem__(key=4, value='e')
# 4 e

v[1:3] = ['a', 'b', 'c', 'd', 'e']
v.__setitem__(key=slice(1, 3), value=['a', 'b', 'c', 'd', 'e'])
# slice(1, 3, None) ['a', 'b', 'c', 'd', 'e']

v[:] = ['a', 'b', 'c', 'd', 'e']
v.__setitem__(key=slice(None), value=['a', 'b', 'c', 'd', 'e'])
# slice(None, None, None) ['a', 'b', 'c', 'd', 'e']

v[2.3] = 4.5
v.__setitem__(key=2.3, value=4.5)
# 2.3 4.5

v[2.3+4.5j] = 6.7+8.9j
v.__setitem__(key=2.3+4.5j, value=6.7+8.9j)
# (2.3+4.5j) (6.7+8.9j)

v[True] = False
v.__setitem__(key=True, value=False)
# True False

v['a'] = 'b'
v.__setitem__(key='a', value='b')
# a b

v[None] = None
v.__setitem__(key=None, value=None)
# None None

v[[2, 3]] = [4, 5]
v.__setitem__(key=[2, 3], value=[4, 5])
# [2, 3] [4, 5]

v[(2, 3)] = (4, 5)
v.__setitem__(key=(2, 3), value=(4, 5))
# (2, 3) (4, 5)

v[{2, 3}] = {4, 5}
v.__setitem__(key={2, 3}, value={4, 5})
# {2, 3} {4, 5}

v[{'a':'b'}] = {'c':'d'}
v.__setitem__(key={'a':'b'}, value={'c', 'd'})
# {'a': 'b'} {'c': 'd'}

print(v[0], v[1], v[2], v[3], v[4])
print(v[1:3])
# TypeError: 'MyCls' object is not subscriptable

print(v.__getitem__(key=0), v.__getitem__(key=1), v.__getitem__(key=2),
      v.__getitem__(key=3), v.__getitem__(key=4))
print(v.__getitem__(key=slice(1, 3)))
# AttributeError: 'MyCls' object has no attribute '__getitem__'

for x in v:    # It breaks when x is 5
    if x == 5: # otherwise infinity loop occurs.
        break
    print(x)
# TypeError: 'MyCls' object is not iterable
Enter fullscreen mode Exit fullscreen mode

Top comments (0)