day30 item系列

item 会将数据操作类似于字典的操作
具体用到的方法
__getitem__(self, item):
__setitem__(self, key, value):
__delitem__(self, key):
__delattr__(self, item):
ps: 这些方法外部都是无法调用的

内部原理:
 1 class Foo:
 2     def __init__(self,name,age,sex):    # 初始化方法,构造方法
 3         self.name = name
 4         self.age = age
 5         self.sex = sex
 6 
 7     def __getitem__(self, item):
 8         if hasattr(self,item):
 9             return self.__dict__[item]
10 
11     def __setitem__(self, key, value):
12         self.__dict__[key] = value
13 
14     def __delitem__(self, key):
15         del self.__dict__[key]
16 
17     def __delattr__(self, item):    # 本身就已经实现了,object类原生支持,其他则需要自己实现
18         del self.__dict__[item]        # 原生就是 f.的方式删除
19 
20 
21 f = Foo("suyang",2,"SB")
22 print(f["name"])
23 
24 f["hobby"] = "egg"
25 print(f["hobby"])
26 
27 del f["hobby"]
28 print(f.__dict__)

正常操作的表象:
 1 class Foo():
 2     def __init__(self,name,age):
 3         self.name = name
 4         self.age = age
 5 
 6 a = Foo("yangtuo",18)    # 本质上内部执行了 __init__ 方法
 7 print(a.__dict__)        # {'name': 'yangtuo', 'age': 18}
 8 a.hobby = "play"         # 本质内部执行的是 __setitem__
 9 print(a.hobby)           # 本质上是内部执行了 __getitem__
10 del a.hobby              # 本质上内部执行了 __delattr__ 
11 print(a.hobby)           # AttributeError: 'Foo' object has no attribute 'hobby'

猜你喜欢

转载自www.cnblogs.com/shijieli/p/9938623.html