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__():是个生成器

posted on 2016-10-30 00:29  jayafs  阅读(83)  评论(0)    收藏  举报

导航