1 # 什么是特殊成员呢?有哪些特殊成员呢?
2 # 见下方所示:
3 # __init__ 在创建对象的时候自动调用该方法
4 # __call__
5 class foo:
6
7 def __init__(self):
8 print("init")
9 def __call__(self, *args, **kwargs):
10 print("call")
11 def __int__(self):
12 return 123
13 def __str__(self):
14 return "wo shi str"
15
16 obj = foo() #实例化对象的时候自动调用 init 方法,实例几次调用几次
17 obj() #类名()() 或者对象() 执行的时候 ,自从调用call 方法
18 print(int(obj)) #当执行int()方法的时候自动调用__int__方法 括号中传的参数是对象
19 print(str(obj)) #当执行str()方法的时候自动调用__str__方法 括号中传的参数是对象
1 # __add__方法
2 # 析构方法 __del__ 是什么意思?
3 # 该方法是在python要销毁该对象的时候促发该方法去执行。
4 # __dict__ 是用啦干什么的呢?
5 # 是用来获取对象或者类中的所有封装的成员并返回一个字典__dict__
6 # 调用列表的时候自动调用__getitem__ __setitem__ __delitem__ 这个 是很重要的!
7
8
9 class foo:
10 def __init__(self,age):
11 self.age = age
12 def __add__(self, other):
13 return self.age + other.age
14
15 # 根据索引值获取值
16 def __getitem__(self, item):
17 return item+10
18 # 根据索引值设置值
19 def __setitem__(self, key, value):
20 print(key,value)
21 # 删除列表值
22 def __delitem__(self, key):
23 print(key)
24
25 obj1 = foo(18)
26 obj2 = foo(20)
27 print(obj1+obj2) #38
28 print(obj1.__dict__) # {'age': 18}
29 print(foo.__dict__) # 这个把不可见的成员也打印出来了
30
31 # 是对象通过索引来进行取值
32 li =foo(39)
33 print(li[29]) # 29就是上面的item参数 # 39
34 li[90] = "我尼玛" # 90 我尼玛
35 del li[100] # 100
1 # 列表类型的切片是如何调用的呢?
2 # 也是通过__getitem__来实现的
3 # 那么是如何实现的呢?
4 # 通过__getitem__当中的slice类来实现的
5 # 此外,切片类还可以实现 item.start item.stop item.step 这些方法的调用
6
7 # 迭代对象的实现 __iter__
8 # 在类中定义了__iter__这个方法之后,该类的实现对象就变成了可迭代对象
9 # 可迭代对象使用for 循环遍历元素的时候,需要将可迭代对象使用iter()转化为迭代器才可以遍历
10 # 实现方法如下:
11 class foo:
12
13 # 处理切片
14 def __getitem__(self, item):
15
16 print(item,type(item))
17
18 if type(item) == slice:
19 print(item.start)
20 print(item.stop)
21 print(item.step)
22 print("调用者希望做切片处理")
23 else:
24
25 print("调用者希望做普通类型的工作")
26
27 def __iter__(self):
28
29 #return [1,23,4,5,10]
30 return iter([1,23,4,5,10])
31
32
33 # 调用下列表触发这个方法来查看下
34
35 li = foo()
36 li[10] #10 <class 'int'>
37 li[2:5:10] #slice(2, 5, 10) <class 'slice'>
38
39 # 可迭代器对象的实现
40 it = foo()
41 for i in it:
42
43 print(i)