python:面向对象进阶
1,反射反射:使用字符串类型的名字去操作变量
反射就没有安全问题,去操作内存中已经存在的变量
?
#反射对象中的属性和方法?
=20
(getattr(A,))
#反射对象的属性 (==ret =getattr(a,<span style="color: #800000">'<span style="color: #800000">name<span style="color: #800000">')<span style="color: #008000">#<span style="color: #008000">通过变量名的字符串形式取到的值
<span style="color: #0000ff">print(ret) #反射对象的方法
ret =getattr(a,
#反射类的方法: hasattr(A,)()
#反射类的属性? =20
(getattr(A,))
#反射模块的属性? (getattr(my,))
#反射自己模块中的变量
(getattr(sys.modules[],],)()
setattr设置/修改变量 <span style="color: #0000ff">pass<span style="color: #000000">
setattr(A,<span style="color: #800000">'<span style="color: #800000">name<span style="color: #800000">',<span style="color: #800000">'<span style="color: #800000">alex<span style="color: #800000">'<span style="color: #000000">) <span style="color: #0000ff">print(A,name) delattr删除变量 delattr(a,)
2,__str__和__repr__改变对象的字符串显示__str__,__repr__ 自定制格式化字符串__format__ == % str(self. =Teacher(,250(>> %r%nezha)
l = [1,2,3,4,5]
== = Classes((py_s9)
(self):
== open()
a
a
#对象后面加括号,触发执行。 #注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()() =
k self.(k,self.= A()()
?3,item系列?__getitem____setitem____delitem__ ===
</span><span style="color: #0000ff">def</span> <span style="color: #800080">__getitem__</span><span style="color: #000000">(self,item):
</span><span style="color: #0000ff">if</span><span style="color: #000000"> hasattr(self,item):
</span><span style="color: #0000ff">return</span> self.<span style="color: #800080">__dict__</span><span style="color: #000000">[item]
</span><span style="color: #0000ff">def</span> <span style="color: #800080">__setitem__</span><span style="color: #000000">(self,key,value):
self.</span><span style="color: #800080">__dict__</span>[key] =<span style="color: #000000"> value
</span><span style="color: #0000ff">def</span> <span style="color: #800080">__delitem__</span><span style="color: #000000">(self,key):
</span><span style="color: #0000ff">del</span> self.<span style="color: #800080">__dict__</span><span style="color: #000000">[key]
f = Foo(<span style="color: #800000">'<span style="color: #800000">egon<span style="color: #800000">',38,<span style="color: #800000">'<span style="color: #800000">男<span style="color: #800000">'<span style="color: #000000">)<span style="color: #0000ff">print(f[<span style="color: #800000">'<span style="color: #800000">name<span style="color: #800000">'<span style="color: #000000">]) f[<span style="color: #800000">'<span style="color: #800000">hobby<span style="color: #800000">'] = <span style="color: #800000">'<span style="color: #800000">男<span style="color: #800000">' <span style="color: #0000ff">print(f.hobby,f[<span style="color: #800000">'<span style="color: #800000">hobby<span style="color: #800000">'<span style="color: #000000">]) <span style="color: #0000ff">del f.hobby <span style="color: #008000">#<span style="color: #008000"> object 原生支持 delattr <span style="color: #0000ff">del f[<span style="color: #800000">'<span style="color: #800000">hobby<span style="color: #800000">'] <span style="color: #008000">#<span style="color: #008000"> 通过自己实现的 <span style="color: #0000ff">print(f.<span style="color: #800080">dict) 4,__new____init__ 初始化方法 __new__ 构造方法 : 创建一个对象 = 1
( (cls,*args,**( object.(A,**a1 =<span style="color: #000000"> A()
a2 =<span style="color: #000000"> A() a3 =<span style="color: #000000"> A() <span style="color: #0000ff">print<span style="color: #000000">(a1) <span style="color: #0000ff">print<span style="color: #000000">(a2) <span style="color: #0000ff">print(a3) 单例模式# 一个类 始终 只有 一个 实例# 当你第一次实例化这个类的时候 就创建一个实例化的对象# 当你之后再来实例化的时候 就用之前创建的对象 = == (cls,** cls. cls. = object. cls.egon = A(<span style="color: #800000">'<span style="color: #800000">egg<span style="color: #800000">',38<span style="color: #000000">)
egon.cloth = <span style="color: #800000">'<span style="color: #800000">小花袄<span style="color: #800000">'<span style="color: #000000"> nezha = A(<span style="color: #800000">'<span style="color: #800000">nazha<span style="color: #800000">',25<span style="color: #000000">) <span style="color: #0000ff">print<span style="color: #000000">(nezha) <span style="color: #0000ff">print<span style="color: #000000">(egon) <span style="color: #0000ff">print<span style="color: #000000">(nezha.name) <span style="color: #0000ff">print<span style="color: #000000">(egon.name) <span style="color: #0000ff">print(nezha.cloth) 5,__eq__ =
</span><span style="color: #0000ff">def</span> <span style="color: #800080">__eq__</span><span style="color: #000000">(self,other):
</span><span style="color: #0000ff">if</span> self.<span style="color: #800080">__dict__</span> == other.<span style="color: #800080">__dict__</span><span style="color: #000000">:
</span><span style="color: #0000ff">return</span><span style="color: #000000"> True
</span><span style="color: #0000ff">else</span><span style="color: #000000">:
</span><span style="color: #0000ff">return</span><span style="color: #000000"> False
ob1 = A(<span style="color: #800000">'<span style="color: #800000">egon<span style="color: #800000">'<span style="color: #000000">)ob2 = A(<span style="color: #800000">'<span style="color: #800000">egg<span style="color: #800000">'<span style="color: #000000">) <span style="color: #0000ff">print(ob1 == ob2) #'=='默认比较内存地址 6,__hash__class A: 7,hashlib#提供摘要算法 hashlib
md5 =(md5.hexdigest())
1,不管算法多么不同,摘要的功能始终不变 2,对于相同的字符串使用同一个算法进行摘要,得到的值总是不变的 3,使用不同算法对相同的字符串进行摘要,得到的值应该不同 4,不管是用什么算法,hashlib的方式永远不变 # 摘要算法# 密码的密文存储# 文件的一致性验证 # 在下载的时候 检查我们下载的文件和远程服务器上的文件是否一致 # 两台机器上的两个文件 你想检查这两个文件是否相等
= input(= input( line = line.split(=== usr == user md5_pwd ==()
#加盐 hashlib
md5 = hashlib.md5(bytes(,encoding=
md5.update(b(md5.hexdigest())
#动态加盐
hashlib
md5 = hashlib.md5(bytes(,encoding=)+b
md5.update(b(md5.hexdigest())
#文件一致性的校验 =
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |