python:面向对象进阶

2018-06-18 00:50:01来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

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__)
View Code

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
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:python初接触

下一篇:【 python 学习笔记 -- 数据库】Python3 + MySQL