day15-4
特殊成员
__call__()
1.class foo:
2. def __init__(self):
3. print("init")
4.
5. def __call__(self, *args, **kwargs):
6. print("call")
7.
8.obj = foo() # 会执行__init__的方法
9.obj() # 会执行__call__的方法
结果:
1.init
2.call
上面的代码等价于
1.class foo:
2. def __init__(self):
3. print("init")
4.
5. def __call__(self, *args, **kwargs):
6. print("call")
7.
8.foo()() # 直接结合在一起写
再来看看下面的代码:加入返回值的结果
1.class foo:
2. def __init__(self):
3. print("init")
4.
5. def __call__(self, *args, **kwargs):
6. print("call")
7. return 1
8.
9.r = foo()()
10.print(r)
结果:
1.init
2.call
3.1
总结:
1、类加括号():执行__init__()方法
2、对象加括号();执行__call__()方法
__getitem__()
引入:
字典可以通过dict来创建;如
1.r = dict(k1 = 122, k2 = 456)
也可以取内部的值
1.r["k1"]
上面创建字典的时候;和面向对象很像;那是否可以通过中括号[]来传值那?
1.class foo:
2. def __getitem__(self, name):
3. print(name)
4.
5.r = foo()
6.r["haha"]
结果:
1.haha
字典可以通过key来设置值;那类的设置方法
1.class foo:
2. def __getitem__(self, name):
3. print(name)
4.
5. def __setitem__(self, key, value):
6. print(key, value)
7.
8.r = foo()
9.r["haha"] = 123
结果显示:
1.haha 123
__delitem__()
那删除那?
1.class foo:
2. def __getitem__(self, name):
3. print(name)
4.
5. def __setitem__(self, key, value):
6. print(key, value)
7. def __delitem__(self, key):
8. print(key)
9.r = foo()
10.del r["dshgj"]
结果:
1.dshgj
总结:
1、当对象后跟中括号 [ ] 的时候;会执行__getitem__()方法
- 注意:除了self;必须传一个参数不然会
报错!2、当通过中括号 [ ] 修改值的时候;会执行
__setitem__()方法
- 注意:除了self;必须传入2个参数;不然会
报错!3、当执行通过key值删除的时候;会执行
__delitem__()方法
- 注意:除了self;必须传入一个参数;不然会
报错!
列表可以通过切片来取值;设置值;删除;那上面例子那?
1.class foo:
2. def __getitem__(self, key):
3. print(key, type(key))
4.
5. def __setitem__(self, key, value):
6. print(key, value, type(key))
7.
8. def __delitem__(self, key):
9. print(key, type(key))
10.r = foo()
11.##### 用切片取值的时候
12.r[1:3]
13.# 加入第三个参数;表示控制取的间隔
14.r[1:5:2]
15.##### 用切片设置值的时候
16.r[1:3] = [11, 22 , 33, 44]
17.#### 用切片删除的时候
18.del r[1:3]
结果显示:
1.slice(1, 3, None) <class 'slice'>
2.slice(1, 5, 2) <class 'slice'>
3.slice(1, 3, None) [11, 22, 33, 44] <class 'slice'>
4.slice(1, 3, None) <class 'slice'>
总结:
1、通过切片获取只得时候;用的同样是__getitem__()
- 2.7版本用的是__getslice__
2、通过切片设置值的时候;用的是
__setitem__()
3、通过切片删除之的时候;用的是__delitem__()
__dict__
获取对象里面的所有成员
1.class foo:
2. def __init__(self):
3. self.name = "haha"
4.
5.obj = foo()
6.r = obj.__dict__
7.print(r)
结果:
1.{'name': 'haha'}
注意:
执行__dict__方法的时候;后面没有括号()
__iter__()
引入:
for循环取列表的时候;相当于迭代里面里面的每个元素
问题:那它怎么能将里面的内容取出来那?
其实列表也算是一个对象;当for循环它的时候;会执行对象的一个 __iter__() 方法
1.class foo:
2. def __iter__(self):
3. yield 1
4. yield 2
5. yield 3
6.
7.obj = foo()
8.for i in obj:
9. print(i)
结果显示:
1.1
2.2
3.3
总结:
1、如果一个对象可以被for循环取迭代的话;执行 for 循环的时候;会自动执行__iter__()方法;同时这个方法里面对应的值(yield)
2、这个__iter__():是个生成器
浙公网安备 33010602011771号