Python自定义数据类型的几个魔术方法

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

猜你喜欢

转载自blog.csdn.net/qq_38882327/article/details/89328562