Python创建自定义数据类型并访问,需要在定义类的时候对一些魔法方法逐一实现。
repr(obj)函数:此法给python解释器运行。
str(obj)函数:此法给人阅读。
说明:
1、str(obj)函数先查找obj.str()方法,若有此方法,则调用并返回结果;
2、若没有obj.str()方法,则再查找obj.repr()方法,若有此方法,则调用并返回结果;
3、若obj.__repr__方法也不存在,则调用object类的__repr__实例方法,返回<main.XXXX object at 0xAABBCCDD>格式的字符串,此为内存地址
# 打印显示类
class Display(object):
def show(self):
return ", ".join("{}".format(getattr(self, key)) for key in self.__dict__)
# 重写__str__定义对象的打印内容,否则只显示内存地址
def __str__(self):
return "{}".format(self.show())
# 如:创建自定义字典类,需继承Display类,否则print时只会显示内存地址
class DictDemo(Display):
# 创建字典
def __init__(self, key, value):
self.dict = {}
self.dict[key] = value
# 通过__getitem__使用mytree[3]获取值的方式,否则不能使用mytree[3]方法获取值
def __getitem__(self, key):
return self.dict[key]
# 通过__setitem__使用mytree[3]="red"方式,否则不能使用mytree[3]="red"方法
def __setitem__(self, key, value):
self.dict[key] = value
# 通过__delitem__调用del方法,否则不能使用del方法
def __delitem__(self, key):
del self.dict[key]
# 通过__len__调用len()方法,否则不能使用len()方法
def __len__(self):
return len(self.dict)
# 通过__contains__调用in方法,若一个集合类型没有实现__contains__方法,那么in运算符就会按顺序做一次迭代搜索。
def __contains__(self, key):
return key in self.dict
dictDemo = DictDemo('key0','value0') #方法一创建字典
print(dictDemo['key0']) #结果为value0,dictDemo["key0"]会自动调用类中的__getitem__方法
dictDemo['key1'] = 'value1' #自动调用类中的__setitem__方法
print(dictDemo['key1']) #结果为value1
print(len(dictDemo)) #结果为2,自动调用类中的__len__方法
print(dictDemo) #删除前
del dictDemo['key0'] #自动调用类中的__delitem__方法
dictDemo['key2'] = 'value2' #自动调用类中的__setitem__方法
print(dictDemo) #删除后
dictDemo1 = {"key0":"value0"} #方法二创建字典
print(dictDemo1["key0"]) #结果为value0
# 通过__contains__调用in方法,若一个集合类型没有实现__contains__方法,那么in运算符就会按顺序做一次迭代搜索。
if 'key0' in dictDemo1:
print('in')
结果为:
value0
value1
2
{'key0': 'value0', 'key1': 'value1'}
{'key1': 'value1', 'key2': 'value2'}
value0
in