python魔法方法以及私有化 (来自潭州教育python爬虫的一枚小学员)
2018-03-24 13:30
567 查看
一、私有化'''以双下划线开头,以双下划线结尾的,python自带的,已经拥有特殊的含义自己属性或者函数不能这样命名'''class TSG: _a = 1 __b = 2 def _fun(self): print('如果人睡觉是为了做梦') def __fun2(self): return ('那我宁可不睡觉')s = TSG()print(s._a)s._fun()print(s._TSG__b) #实例._类名__私有属性 可以访问双下划线的私有属性print(s._TSG__fun2())二 、构造方法:__init__( ) 析构方法 :__del__( )class Face: # 类的构造器/类的初始化 __init__ 方法,实例化的时候自动运行 def __init__(self,yourname,yourage,yoursex): self.name = yourname self.age = yourage self.sex = yoursex #类的析构器 将对象删除以释放内存,一般放在末尾,类执行完的时候自动删除对象 def __del__(self): print('%s已死,有事说事,没事多烧纸'%self.name)s = Face('张三','250','去过泰国')结果:张三已死,有事说事,没事多烧纸
三、字符串的展示 1:对用户友好的:__str__( ) 2: 对开发者友好的:__repr__( ) class Adidas: def __init__(self,stunum,stuname,stubanji): self.num = stunum self.name = stuname self.banji = stubanji def __str__(self): return '我叫'+self.name+'学号是'+self.num+'是'+self.banji+'的学生'a = Adidas('123456','Jim','钱学森实验1班')print(str(a))print(repr(a))结果:我叫Jim学号是123456是钱学森实验1班的学生 #此行是str打印的结果<__main__.Adidas object at 0x000001ECB379F940> #此行是继承的object的默认repr打印的结果,返回 的是一个类似内存地址的对象两点注意:1、在普通的Idle中 repr和str共存的话,那么str的优先级高于repr,程序默认执行str而不去执行repr 而在shell脚本模式或者称为交互模式下的话,只有repr,这就是为什么在shell中输入变量名就能打印 结果的
4000
原因2、对于程序员来说我可能已经知道要打印什么结果或者说是已经测试过了,所以我就没有必要用str,这 样还能节省不必要的文本内存花销
1四、属性操作的内置函数 设置属性 setattr() 获取属性 getattr() 归属问题的判断hasattr( ) 删除属性 delattr()class Test: a = 'abc' b = 123 def fun(self,thing): self.thing = thing print(self.thing)t = Test() #实例化对象t#1、归属问题的判断,存在打印99乘法口诀if hasattr(t,'a'): #返回bool值, for i in range(1,10): for j in range(1,i+1): print('%s * %s = %2s'%(i,j,i*j),end = ' ') print(' ')#2、为t设置m属性,然后m的归属问题判断,存在就打印第10次斐波那契数列setattr(Test,'m',20)if hasattr(t,'m'): a = 0 b = 1 for i in range(10): a,b = a+b,a print(a)#3、查询属性值,查出属性m的值,并将其分解因数num = getattr(t,'m') #三个参数,查询实例属性,最后一个参数表示,如果查到了就返回原值,反之则返回最后一个参数while num != 1: for i in range(1, num + 1): if (num % i) == 0 and i != 1: num = num // i if num == 1: print (" %d"%i,end = ' ') else: print (" %d*"%i,end = ' ') break#查询和设置的嵌套使用print(getattr(t,'c',setattr(t,'c',456)))#4、删除对象属性delattr(Test,'a') #两个参数,实例或者类名, 实例不能删除共有的属性,类不能删除实例属性print(hasattr(t,'a'))结果:1 * 1 = 1 2 * 1 = 2 2 * 2 = 4 3 * 1 = 3 3 * 2 = 6 3 * 3 = 9 4 * 1 = 4 4 * 2 = 8 4 * 3 = 12 4 * 4 = 16 5 * 1 = 5 5 * 2 = 10 5 * 3 = 15 5 * 4 = 20 5 * 5 = 25 6 * 1 = 6 6 * 2 = 12 6 * 3 = 18 6 * 4 = 24 6 * 5 = 30 6 * 6 = 36 7 * 1 = 7 7 * 2 = 14 7 * 3 = 21 7 * 4 = 28 7 * 5 = 35 7 * 6 = 42 7 * 7 = 49 8 * 1 = 8 8 * 2 = 16 8 * 3 = 24 8 * 4 = 32 8 * 5 = 40 8 * 6 = 48 8 * 7 = 56 8 * 8 = 64 9 * 1 = 9 9 * 2 = 18 9 * 3 = 27 9 * 4 = 36 9 * 5 = 45 9 * 6 = 54 9 * 7 = 63 9 * 8 = 72 9 * 9 = 81 以上不是乱码,是地方太小放不下112358132134552* 2* 5 456False其他特殊的属性:__name__ __class__ __doc__ __dict__在如上代码中加入第一,__name__的使用从#1前边一行加入(文件名为has_test)if __name__ == '__main__':(后边对应缩进)后边的程序代码只有在当前也就是名为has_test的文件下运行才会被执行当我用另外一个名为specialatrribute.py的文件调用刚才has_test时,后边的代码并不会被执行
#2、__class__的使用 from has_test import Test t = Test() print(t.__class__)结果
auther:Flexin_
data:2018.3.24
三、字符串的展示 1:对用户友好的:__str__( ) 2: 对开发者友好的:__repr__( ) class Adidas: def __init__(self,stunum,stuname,stubanji): self.num = stunum self.name = stuname self.banji = stubanji def __str__(self): return '我叫'+self.name+'学号是'+self.num+'是'+self.banji+'的学生'a = Adidas('123456','Jim','钱学森实验1班')print(str(a))print(repr(a))结果:我叫Jim学号是123456是钱学森实验1班的学生 #此行是str打印的结果<__main__.Adidas object at 0x000001ECB379F940> #此行是继承的object的默认repr打印的结果,返回 的是一个类似内存地址的对象两点注意:1、在普通的Idle中 repr和str共存的话,那么str的优先级高于repr,程序默认执行str而不去执行repr 而在shell脚本模式或者称为交互模式下的话,只有repr,这就是为什么在shell中输入变量名就能打印 结果的
4000
原因2、对于程序员来说我可能已经知道要打印什么结果或者说是已经测试过了,所以我就没有必要用str,这 样还能节省不必要的文本内存花销
1四、属性操作的内置函数 设置属性 setattr() 获取属性 getattr() 归属问题的判断hasattr( ) 删除属性 delattr()class Test: a = 'abc' b = 123 def fun(self,thing): self.thing = thing print(self.thing)t = Test() #实例化对象t#1、归属问题的判断,存在打印99乘法口诀if hasattr(t,'a'): #返回bool值, for i in range(1,10): for j in range(1,i+1): print('%s * %s = %2s'%(i,j,i*j),end = ' ') print(' ')#2、为t设置m属性,然后m的归属问题判断,存在就打印第10次斐波那契数列setattr(Test,'m',20)if hasattr(t,'m'): a = 0 b = 1 for i in range(10): a,b = a+b,a print(a)#3、查询属性值,查出属性m的值,并将其分解因数num = getattr(t,'m') #三个参数,查询实例属性,最后一个参数表示,如果查到了就返回原值,反之则返回最后一个参数while num != 1: for i in range(1, num + 1): if (num % i) == 0 and i != 1: num = num // i if num == 1: print (" %d"%i,end = ' ') else: print (" %d*"%i,end = ' ') break#查询和设置的嵌套使用print(getattr(t,'c',setattr(t,'c',456)))#4、删除对象属性delattr(Test,'a') #两个参数,实例或者类名, 实例不能删除共有的属性,类不能删除实例属性print(hasattr(t,'a'))结果:1 * 1 = 1 2 * 1 = 2 2 * 2 = 4 3 * 1 = 3 3 * 2 = 6 3 * 3 = 9 4 * 1 = 4 4 * 2 = 8 4 * 3 = 12 4 * 4 = 16 5 * 1 = 5 5 * 2 = 10 5 * 3 = 15 5 * 4 = 20 5 * 5 = 25 6 * 1 = 6 6 * 2 = 12 6 * 3 = 18 6 * 4 = 24 6 * 5 = 30 6 * 6 = 36 7 * 1 = 7 7 * 2 = 14 7 * 3 = 21 7 * 4 = 28 7 * 5 = 35 7 * 6 = 42 7 * 7 = 49 8 * 1 = 8 8 * 2 = 16 8 * 3 = 24 8 * 4 = 32 8 * 5 = 40 8 * 6 = 48 8 * 7 = 56 8 * 8 = 64 9 * 1 = 9 9 * 2 = 18 9 * 3 = 27 9 * 4 = 36 9 * 5 = 45 9 * 6 = 54 9 * 7 = 63 9 * 8 = 72 9 * 9 = 81 以上不是乱码,是地方太小放不下112358132134552* 2* 5 456False其他特殊的属性:__name__ __class__ __doc__ __dict__在如上代码中加入第一,__name__的使用从#1前边一行加入(文件名为has_test)if __name__ == '__main__':(后边对应缩进)后边的程序代码只有在当前也就是名为has_test的文件下运行才会被执行当我用另外一个名为specialatrribute.py的文件调用刚才has_test时,后边的代码并不会被执行
from has_test import Test class A: pass if __name__ == '__main__': print(Test.__name__)结果只有一个Test
#2、__class__的使用 from has_test import Test t = Test() print(t.__class__)结果
<class 'has_test.Test'> (和type类似,但是类的__class__还是__class__)
#3、__doc__ 对class的文本标注 class C: ''' 这只是一个小测试 auther:Flexin_ data:2018.3.24 ''' pass print(C.__doc__)结果: 这只是一个小测试
auther:Flexin_
data:2018.3.24
#4、__dict__ 存储对象(实例)属性的字典 class D: def __init__(self,a,b,c): self.a = a self.b = b self.c = c d = D(1,2,3) print(d.__dict__结果:{'a': 1, 'b': 2, 'c': 3}
相关文章推荐
- python爬虫中get和post方法介绍以及cookie作用
- python爬虫get和post方法的使用以及cookie
- Python 简单爬虫程序 以及 urllib.urlretrieve()方法 改变文件存放文件位置
- Python-爬取音悦台MV列表以及反爬虫方法
- python中__init__()、__new__()、__call__()、__del__()几个魔法方法的用法
- Python基础教程 第9章: 魔法方法、属性和迭代器 学习笔记
- python魔法方法
- 标准爬虫初探,来自Python之父的大餐!
- python魔法方法-属性访问控制详解
- windows下Python2与Python3共存的使用方法以及pip的使用方法以及pip安装报错:is not a supported wheel on this platform的处理方法
- python安装MySQLdb:在windows下或linux下(以及eclipse中pydev使用msqldb的配置方法)
- Python学习之魔法方法、属性和迭代器
- 在linux下python爬虫进程发生异常时自动重启直至正常结束的方法
- python一些常用方法以及模块的使用
- 笨方法学python 41:来自 Percal 25 号行星的哥顿人 (Gothons)
- xpath的使用方法以及python爬取数据的保存
- python爬虫之selenium安装以及使用
- python 魔法方法
- python-求在pi的方法 来自python cookbook上 just for fun
- python网络爬虫之如何伪装逃过反爬虫程序的方法