DEV Community

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

Posted on

__getitem__ & __setitem__ in Python (3)

Buy Me a Coffee

*Memos:

You can create a custom set, dictionary and string with __getitem__() and __setitem__() as shown below:

<Custom subscriptable & assignable set with upper() & lower()>

class MySet:
    data = {'a', 'b', 'c', 'd', 'e'}

    def __getitem__(self, index):
        if isinstance(index, int):
            return list(self.data)[index]
        elif isinstance(index, slice):
            return set(list(self.data)[index])

    def __setitem__(self, index, value):
        temp = list(self.data)
        temp[index] = value
        self.data = set(temp)

    def upper(self):
        self.data = {x.upper() for x in self.data}

    def lower(self):
        self.data = tuple(x.lower() for x in self.data)

v = MySet()

print(v)
# <__main__.MySet object at 0x0000029B85E779B0>

print(v[0], v[1], v[2], v[3], v[4])
print(v.__getitem__(index=0), v.__getitem__(index=1),
      v.__getitem__(index=2), v.__getitem__(index=3),
      v.__getitem__(index=4))
# e c a d b

print(v[1:3])
print(v.__getitem__(index=slice(1, 3)))
# {'a', 'c'}

print(v[:])
print(v.__getitem__(index=slice(None)))
# {'e', 'a', 'b', 'c', 'd'}

for x in v:
    print(x)
# e
# c
# a
# d
# b

v.upper()

print(v[:])
# {'A', 'D', 'E', 'C', 'B'}

v[0] = 'X'
v[1:5] = {'Y', 'Z'}

print(v[:])
# {'Y', 'Z', 'D'}

v.lower()

print(v[:])
# {'z', 'd', 'y'}
Enter fullscreen mode Exit fullscreen mode

<Custom dictionary with upper() & lower()>

class MyDict:
    data = {'fname': 'John', 'lname': 'Smith', 'age': 36, 'gender': 'Male'}
    def __getitem__(self, key):
        return self.data[key]

    def __setitem__(self, key, value):
        self.data[key] = value

    def upper(self):
        self.data = {x: y.upper() if isinstance(y, str) else y
                     for x, y in self.data.items()}
    def lower(self):
        self.data = {x: y.lower() if isinstance(y, str) else y
                     for x, y in self.data.items()}
v = MyDict()

print(v)
# <__main__.MyDict object at 0x0000029B85E8BCB0>

print(v['fname'], v['lname'], v['age'], v['gender'])
print(v.__getitem__(key='fname'), v.__getitem__(key='lname'),
      v.__getitem__(key='age'), v.__getitem__(key='gender'))
# John Smith 36 Male

v.upper()

print(v['fname'], v['lname'], v['age'], v['gender'])
# JOHN SMITH 36 MALE

v['fname'] = 'Anna'
v['gender'] = 'Female'

print(v['fname'], v['lname'], v['age'], v['gender'])
# Anna SMITH 36 Female

v.lower()

print(v['fname'], v['lname'], v['age'], v['gender'])
# anna smith 36 female
Enter fullscreen mode Exit fullscreen mode

<Custom string with upper() & lower()>

class MyStr:
    data = 'abcde'

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

    def __setitem__(self, index, value):
        temp = list(self.data)
        temp[index] = value
        self.data = ''.join(temp)

    def upper(self):
        self.data = self.data.upper()

    def lower(self):
        self.data = self.data.lower()

v = MyStr()

print(v)
# <__main__.MyStr object at 0x0000029B84F879B0>

print(v[0], v[1], v[2], v[3], v[4])
print(v.__getitem__(index=0), v.__getitem__(index=1),
      v.__getitem__(index=2), v.__getitem__(index=3),
      v.__getitem__(index=4))
# a b c d e

print(v[1:3])
print(v.__getitem__(index=slice(1, 3)))
# bc

print(v[:])
print(v.__getitem__(index=slice(None)))
# abcde

for x in v:
    print(x)
# a
# b
# c
# d
# e

v.upper()

print(v[:])
# ABCDE

v[0] = 'X'
v[1:5] ='YZ'

print(v[:])
# XYZ

v.lower()

print(v[:])
# xyz
Enter fullscreen mode Exit fullscreen mode

Top comments (0)