(完整学习过程屏幕记录视频地址在文末,手写笔记在文末)
今天发现了python的类中隐藏着一些特殊的私有方法。
这些私有方法不管我们定义类时是否在类的内部代码块中定义过它们,这些私有方法都是存在的。比如已经知道的 __init__ 方法就是其中一个。
一、__str__
此方法将输出在本身的相关信息文本。
测试:
class ghlh(object):
name='孤荷凌寒'
qq='578652607'
newghlh=ghlh()
strTemp=newghlh.__str__()
print(strTemp)
运行结果 :
当然同 __init__ 方法一样,我们可以自己重新覆盖 书写 此方法的代码:
class ghlh(object):
name='孤荷凌寒'
qq='578652607'
def __str__(self):
return self.name
newghlh=ghlh()
strTemp=newghlh.__str__()
print(strTemp)
现在的运行结果:
孤荷凌寒
二、__iter__
通过类的此方法,可以使一个类的实例化对象变成一个迭代器。
但是此方法必须配合显式定义过的:
__next__
方法同时使用才有实际功用。
测试如下:
class ghlh(object):
name='孤荷凌寒'
qq='578652607'
a=0
b=1
def __str__(self):
return self.name
def __init__(self,a=0,b=1):
self.a=a
self.b=b
def __iter__(self):
return self #通过此语句,使类的实例化对象成为一个迭代器,可以在被 循环语句 读取时,每次返回自身中 __next__ 方法的下一对象值
def __next__(self):
self.a,self.b=self.b,self.a+self.b #每次被访问本迭代器时,都返回当前a,b的下一个值,b=上一个a+上一个b
if self.a>10000: #加个条件,使本 迭代器 成为一个有限元素的 迭代器,否则将无穷下去。
raise StopIteration #当达到条件时,通过raise返回一个迭代元素结束的错误来使本 迭代器 的元素是有限的。
return self.a #每次被 访问 本迭代器时,将a的值返回给调用的 循环语句
newghlh=ghlh()
#strTemp=newghlh.__str__()
#print(strTemp)
#因为我们已经在类中定义了 __iter__ 方法 和 __next__ 方法,现在类的实例化对象 newghlh 已经成为了一个迭代器,可以在循环体中直接使用了。
for n in newghlh:
print(n)
运行结果 :
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
三、 __getitem__
通过显式地编写好此私有方法的代码,可以实现将类实例化后的对象当作列表来使用的效果。
测试:
class ghlh(object):
name='孤荷凌寒'
qq='578652607'
a=0
b=1
def __str__(self):
return self.name
def __init__(self,a=0,b=1):
self.a=a
self.b=b
def __iter__(self):
return self #通过此语句,使类的实例化对象成为一个迭代器,可以在被 循环语句 读取时,每次返回自身中 __next__ 方法的下对象值
def __next__(self):
self.a,self.b=self.b,self.a+self.b #每次被访问本迭代器时,都返回当前a,b的下一个值,b=上一个a+上一个b
if self.a>10000: #加个条件,使本 迭代器 成为一个有限元素的 迭代器,否则将无穷下去。
raise StopIteration #当达到条件时,通过raise返回一个迭代元素结束的错误来使本 迭代器 的元素是有限的。
return self.a #每次被 访问 本迭代器时,将a的值返回给调用的 循环语句
def __getitem__(self,n):
for x in range(n): #将a的值变化 n 次(最大次数),然后就相当于建立 了一个 内部元素 总数为 n 个的列表
self.a,self.b=self.b,self.a+self.b
return self.a
newghlh=ghlh()
#strTemp=newghlh.__str__()
#print(strTemp)
#因为我们已经在类中定义了 __iter__ 方法 和 __next__ 方法,现在类的实例化对象 newghlh 已经成为了一个迭代器,可以在循环体中直接使用了。
#for n in newghlh:
# print(n)
intNew=newghlh[3] #现在对于 ghlh 类实例化的 对象 newghlh 可以像使用 列表一样访问其元素了。
print(intNew)
运行结果 :
2
四、__getattr__
通过此内部方法来获取类实例化后的对象中的对象时,就算要获取 的对象根本不存在,也不会抛出错误。
五、__call__
通过显式地编写此私有方法的代码,主要是给此方法函数添加形式参数(也可以不添加形式参数),并让函数内部代码块执行一定的操作。
那么只要在类的内部代码块中显式地重定义了此方法函数,就可以将 此 类 实例化后的对象名 当作一个函数名称来使用,当调用这个“函数”时,实则上是执行了类代码中的私有方法:
__call__
测试:
class ghlh(object):
name='孤荷凌寒'
qq='578652607'
a=0
b=1
def __str__(self):
return self.name
def __init__(self,a=0,b=1):
self.a=a
self.b=b
def __iter__(self):
return self #通过此语句,使类的实例化对象成为一个迭代器,可以在被 循环语句 读取时,每次返回自身中 __next__ 方法的下对象值
def __next__(self):
self.a,self.b=self.b,self.a+self.b #每次被访问本迭代器时,都返回当前a,b的下一个值,b=上一个a+上一个b
if self.a>10000: #加个条件,使本 迭代器 成为一个有限元素的 迭代器,否则将无穷下去。
raise StopIteration #当达到条件时,通过raise返回一个迭代元素结束的错误来使本 迭代器 的元素是有限的。
return self.a #每次被 访问 本迭代器时,将a的值返回给调用的 循环语句
def __getitem__(self,n):
for x in range(n): #将a的值变化 n 次(最大次数),然后就相当于建立 了一个 内部元素 总数为 n 个的列表
self.a,self.b=self.b,self.a+self.b
return self.a
def __call__(self,strMsg):
print('这是在类内部代码块中声明的一个方法:收到的形式参数对应的实参的值是:“' + strMsg + '”')
newghlh=ghlh()
#strTemp=newghlh.__str__()
#print(strTemp)
#因为我们已经在类中定义了 __iter__ 方法 和 __next__ 方法,现在类的实例化对象 newghlh 已经成为了一个迭代器,可以在循环体中直接使用了。
#for n in newghlh:
# print(n)
#intNew=newghlh[3] #现在对于 ghlh 类实例化的 对象 newghlh 可以像使用 列表一样访问其元素了。
#print(intNew)
newghlh('将类的实例化后的对象当作了函数来使用,这是传递的实际参数') #现在可以像调用函数一样调用这个类的实例化对象名称
运行结果:
这是在类内部代码块中声明的一个方法:收到的形式参数对应的实参的值是:“将类的实例化后的对象当作了函数来使用,这是传递的实际参数”
我的qq号:578652607 微信: dalingshu
就是要学社群www.941xue.com/index.aspx