python:面向对象进阶
2018-06-18 00:50:01来源:未知 阅读 ()
1,反射
class A: price=20 print(getattr(A,'price'))
#反射对象的属性
class A: def func(self): print('in func') a =A() a.name ='alex' ret =getattr(a,'name')#通过变量名的字符串形式取到的值 print(ret)
ret =getattr(a,'func') ret()
#反射类的方法:
if hasattr(A,'func')): getattr(A,'func')()
#反射类的属性
class A: price=20 print(getattr(A,'price'))
#反射模块的属性
import my print(getattr(my,'day'))
import sys print(getattr(sys.modules['__main__'],'year')) getattr(sys.modules['__main__'],'qqxing')()
setattr设置/修改变量
class A: pass setattr(A,'name','alex') print(A,name)
delattr删除变量
delattr(a,'name')
2,__str__和__repr__
改变对象的字符串显示__str__,__repr__
自定制格式化字符串__format__
# 双下方法 # obj.__str__ str(obj) # obj.__repr__ repr(obj)
class Teacher: def __init__(self,name,salary): self.name =name self.salary =salary def __str__(self): return "Teacher's object :%s"%self.name def __repr__(self): return str(self.__dict__) def func(self): return 'wahaha' nezha =Teacher('nazha',250) print(nazha) print(repr(nezha)) print('>>> %r'%nezha)
#object 里有一个__str__,一旦被调用,就返回调用这个方法的#对象的内存地址 l = [1,2,3,4,5] # 实例化 实例化了一个列表类的对象 print(l) # %s str() 直接打印 实际上都是走的__str__ # %r repr() 实际上都是走的__repr__ # repr 是str的备胎,但str不能做repr的备胎 # print(obj)/'%s'%obj/str(obj)的时候,实际上是内部调用了obj.__str__方法,如果str方法有,那么他返回的必定是一个字符串 # 如果没有__str__方法,会先找本类中的__repr__方法,再没有再找父类中的__str__。 # repr(),只会找__repr__,如果没有找父类的
class Classes: def __init__(self,name): self.name = name self.student = [] def __len__(self): return len(self.student) def __str__(self): return 'classes' py_s9= Classes('python全栈9期') py_s9.student.append('二哥') py_s9.student.append('泰哥') print(len(py_s9)) print(py_s9)
#__del__ class A: def __del__(self): # 析构函数: 在删除一个对象之前进行一些收尾工作 self.f.close() a = A() a.f = open() # 打开文件 第一 在操作系统中打开了一个文件 拿到了文件操作符存在了内存中 del a # a.f 拿到了文件操作符消失在了内存中 del a # del 既执行了这个方法,又删除了变量
# __call__
#对象后面加括号,触发执行。
#注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
class A: def __init__(self,name): self.name = name def __call__(self): ''' 打印这个对象中的所有属性 :return: ''' for k in self.__dict__: print(k,self.__dict__[k]) a = A('alex')()
3,item系列
__getitem__\__setitem__\__delitem__
class Foo: def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex def __getitem__(self, item): if hasattr(self,item): return self.__dict__[item] def __setitem__(self, key, value): self.__dict__[key] = value def __delitem__(self, key): del self.__dict__[key] f = Foo('egon',38,'男') print(f['name']) f['hobby'] = '男' print(f.hobby,f['hobby']) del f.hobby # object 原生支持 __delattr__ del f['hobby'] # 通过自己实现的 print(f.__dict__)
4,__new__
__init__ 初始化方法
__new__ 构造方法 : 创建一个对象
class A: def __init__(self): self.x = 1 print('in init function') def __new__(cls, *args, **kwargs): print('in new function') return object.__new__(A, *args, **kwargs) a1 = A() a2 = A() a3 = A() print(a1) print(a2) print(a3)
单例模式
# 一个类 始终 只有 一个 实例
# 当你第一次实例化这个类的时候 就创建一个实例化的对象
# 当你之后再来实例化的时候 就用之前创建的对象
class A: __instance = False def __init__(self,name,age): self.name = name self.age = age def __new__(cls, *args, **kwargs): if cls.__instance: return cls.__instance cls.__instance = object.__new__(cls) return cls.__instance egon = A('egg',38) egon.cloth = '小花袄' nezha = A('nazha',25) print(nezha) print(egon) print(nezha.name) print(egon.name) print(nezha.cloth)
5,__eq__
class A: def __init__(self,name): self.name = name def __eq__(self, other): if self.__dict__ == other.__dict__: return True else: return False ob1 = A('egon') ob2 = A('egg') print(ob1 == ob2)
#'=='默认比较内存地址
6,__hash__class A:
def __init__(self,name,sex):
self.name = name
self.sex = sex
def __hash__(self):
return hash(self.name+self.sex)
a = A('egon','男')
b = A('egon','nv')
print(hash(a))
print(hash(b))
7,hashlib#提供摘要算法
import hashlib#提供摘要算法的模块 md5 =hashlib.md5() md5.update(b'alex3714') print(md5.hexdigest())
1,不管算法多么不同,摘要的功能始终不变
2,对于相同的字符串使用同一个算法进行摘要,得到的值总是不变的
3,使用不同算法对相同的字符串进行摘要,得到的值应该不同
4,不管是用什么算法,hashlib的方式永远不变
# 摘要算法
# 密码的密文存储
# 文件的一致性验证
# 在下载的时候 检查我们下载的文件和远程服务器上的文件是否一致
# 两台机器上的两个文件 你想检查这两个文件是否相等
#用户的登录 import hashlib usr = input('username :') pwd = input('password : ') with open('userinfo') as f: for line in f: user,passwd,role = line.split('|') md5 = hashlib.md5() md5.update(bytes(pwd,encoding='utf-8')) md5_pwd = md5.hexdigest() if usr == user and md5_pwd == passwd: print('登录成功')
#加盐
import hashlib # 提供摘要算法的模块 md5 = hashlib.md5(bytes('盐',encoding='utf-8')) # md5 = hashlib.md5() md5.update(b'123456') print(md5.hexdigest())
#动态加盐
# 动态加盐 # 用户名 密码 # 使用用户名的一部分或者 直接使用整个用户名作为盐 import hashlib # 提供摘要算法的模块 md5 = hashlib.md5(bytes('盐',encoding='utf-8')+b'') # md5 = hashlib.md5() md5.update(b'123456') print(md5.hexdigest())
#文件一致性的校验
import hashlib md5 = hashlib.md5() md5.update(b'alex') md5.update(b'3714') print(md5.hexdigest()) # 文件的一致性校验这里不需要加盐
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- python3基础之“术语表(2)” 2019-08-13
- python3 之 字符串编码小结(Unicode、utf-8、gbk、gb2312等 2019-08-13
- Python3安装impala 2019-08-13
- 小白如何入门 Python 爬虫? 2019-08-13
- python_字符串方法 2019-08-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash