1 Python自学 - 类进阶(让类像列表和字典那样工作)
可能有读者会好奇,我自己创建的类, 能否像列表和字典那样工作呢?
比如:前文中定义的Human
类,能不能使用下面的语句来设置属性呢?
h = Human('小飞棍', 22, '男')
h['age'] = 23 #疑问:能不能这样设置属性?
带着这个疑问, 我们进入下面的学习。
1.1 让类像字典那样设置属性
细心的读者可能会发现,每个对象都有一个内部成员__dict__
,看看它能带来什么?
class Human:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
h = Human('小飞棍', 22, '男')
print(h.__dict__) #输出:{'name': '小飞棍', 'age': 22, 'gender': '男'}
对象的内部成员__dict__
是不是刚好就用字典保存了所有的属性和属性值?
下面我们尝试通过__dict__
成员入手,来实现类的字典功能。
class Human:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
def __setitem__(self, key, value):
self.__dict__[key] = value
def __getitem__(self, key):
return self.__dict__.get(key)
h = Human('小飞棍', 22, '男')
h['age'] = 23
print(h['age']) #输出: 23
示例中,我们可以让Human
类的对象,使用h['age']
来设置和读取属性了!
这里的关键就是这两个内部函数:
__setitem__()
:当对象使用字典形式的赋值时,就会映射到该函数。__getitem__()
:当对象使用字典形式的读取成员时,会映射到该函数。
现在真相大白了,原来是这两个内部函数映射了字典的行为!
1.2 创建自己的列表类
Python
中的列表索引是从0开始的,但部分语言也有使用索引从1开始的列表(数组),下面我们尝试编写一个索引从1开始的列表:
class CustomList:
def __init__(self, *args):
self.data = list(args)
def __getitem__(self, index):
if index == 0:
raise IndexError("Index starts from 1")
return self.data[index - 1]
def __setitem__(self, index, value):
if index == 0:
raise IndexError("Index starts from 1")
self.data[index - 1] = value
def __len__(self):
return len(self.data)
def append(self, item):
self.data.append(item)
def insert(self, index, item):
self.data.insert(index - 1, item)
def remove(self, item):
self.data.remove(item)
def __str__(self):
return str(self.data)
l1 = CustomList(1,2,3)
print(l1[1]) #输出:1
示例在__getitem__()
,__setitem__()
两个内置函数中对索引进行了特殊处理,读者可以根据具体的业务场景进行其他特殊逻辑处理。
作者声明:本文用于记录和分享作者的学习心得,部分文字或示例来源豆包AI,由于本人水平有限,难免存在表达错误,欢迎交流和指教!
Copyright © 2022~2025 All rights reserved.