zoukankan      html  css  js  c++  java
  • python--软件规范和反射

    软件开发规范

      写一个作业的时候,要将写的代码分开
      bin文件夹里面第一个是start文件
      核心代码都在core文件夹里面  文件core最好也是固定名字

      BaseDir=os.path.dirname(os.path.dirname(os.getcwd()))
      sys.path.append(BaseDir)
      from ChoiceCourses.core import core
      core.main()

      db文件夹就存所有的数据
      lib 放一些扩展模块,包
      log记录操作的日志
      conf文件夹中写配置文件
    isinstance和issubclass

    isinstance()
    from collections import Iterable
    isinstance(range(10),Iterable)

    判断是不是一个可迭代对象

    class Foo(object):pass
    obj=Foo()
    isinstance(obj,Foo)

    判断是不是类的对象

    如果有继承关系,就不准确
    如果有继承关系的话,也是这个子类的父类的对象,所以不准确
    issubclass看是否有继承关系

    反射

    必须会getattr和hasattr

    class SB:
        def __init__(self,name):
            self.name=name
        def happy(self):
            print('%s is happy'%self.name)
    jinghong=SB('景洪')
    jinghong.happy()
    s='happy'
    func=getattr(jinghong,'happy')
    func()

    getattr可以用字符串调用方法,就是括号前面放对象,后面放方法的字符串格式
    ret=getattr(jinghong,'name')这样也可以调用name   平常调用不了self.name
    但是这样的话就可以调
    反射:把一个字符串数据类型的变量变成一个真实存在这个程序中的变量名,并且能够使用他
    hasattr判断是否存在这个要执行的如果存在返回True
    可以用输入的方法来进行调用了
    import sys
    sys.modules['__main__']表示当前路径的模块
    想要引用当前自己模块的方法的话,就要借用这个方法
    [__name__]谁调用就是谁的路径模块

    import sys
    def jing():
        print('jing_sb')
    sy='shengyue'
    n=input('>>')
    z=input('>>')
    getattr(sys.modules[__name__],n)()
    print(getattr(sys.modules[__name__],z))

    用字符串调用自己模块的方法

    getattr是反射的灵魂
    hasatte和getattr是最佳cp
           类名调属性或方法(静态属性,静态方法和类方法)
        对象名调属性或方法(对象属性,普通方法(self))
        模块名调用属性或方法(变量,函数)
        在自己模块中调用属性或方法(变量,函数)
    setattr(jinghong,'sex','female')  只能添加静态方法
    这样可以添加属性  sex是属性名,female是值
    setattr并不能真的把绑定方法绑定
    delattr()   删除属性

    内置方法

    __str__   这样的话

    __repr__比str的要好   没有__str__的话str()也实现  但是没有__respr__
    只有str的话str无法实现repr()
    repr是str的备胎
    __del__  直接del  就执行了  是del顺带触发的(析构函数)
    不调用__del__自己也会执行
    对象加()自动回执行 def __call__(self)
    (cat==dog)自动触发双下eq
    hash()自动出发双下hash

    class Animal:
        def __str__(self):
        return '%s : %s'%(self.kind,self.name)
    print(str(cat))
    

    item系列

    __getitem__(self,item)方法
    getattr(self,item)是该返回的
    这个系列都是用中括号,字典一样取值
    这个是取值
    要是想赋值的话:
    用  __setitem__(self,key,value)
    这样的话就可以给item系列的key进行赋值
    单例模式:
    由于特殊需求使一个类从始至终只能有一个对象
    实例始终只有一个,他的属性可以随着你的改变而改变

    class Teacher(object):
        __isinstance=None
        def __new__(cls,*args,**kwargs):
            if not cls.__isinstance:
                cls.__isinstance=object.__new__(cls)
            return cls.__isinstance
        def __init__(self,name,cloth):
            self.name=name
            self.cloth=cloth
    liulaoshi=Teacher('liulaoshi','白色')
    print(liulaoshi)
    wanglaoshi=Teacher('王庆帅','黑色')
    print(wanglaoshi)

    shuffle打乱顺序
    常用模块补充:
    hashlib    摘要算法
    hash()算法,任何一个对象进去都有唯一一个对应值
    hashlib检验文件的一致性
    存储密文密码

    两种算法

    一个md5   速度很快最常见的摘要算法,生成结果是固定的128bit字节,通常用一个32位的16进制字符串表示
    一个sha1  结果是160bit字节,通常用40位的16进制字符串表示  更安全一点,但是慢  越长越安全越长越慢
    检验文件一致性:打开文件取出来直接检验就行

    import hashlib
    md5_obj=hashlib.md5()
    md5_obj.update(bytes('李杰',encoding='utf-8))   只接受bytes类型
    print(md5_obj.hexdigest())

    想要使用的话要转成bytes类型
    摘要的话值永远不会变
    支持一部分一部分的去做摘要
    可以分开去进行算法

    存储密文

    将密码的hash放进文件然后判断输入的hash是否相同
    md5单向的,智能摘要成密文,不能反解
    还是可以暴力破解
    md5可以加严

    logging模块


    默认从warning级别开始往下打印

    import logging
    logging.basicConfig(level=logging.DEBUG,format='%(asctime)s[%(lineno)d]%(message)s' datefmt='%y/%m/%d %H:%M:%S' filename='test.log' filemode='w') logging.debug() logging.info logging.warning logging.error logging.critical logger对象: logger=logging.getLogger() logger.addHandler()
  • 相关阅读:
    音乐播放器
    对象的单体模式和面向对象
    箭头函数详解及this指向
    ES6的基础语法
    房贷灵活计算器
    [译文] SQL JOIN,你想知道的应该都有
    [Perl] 删除数组中重复元素
    [Qt] 自定义 滚动条 样式
    nodejs之异步思想
    导致人生失败的31种原因(转自csdn博客)
  • 原文地址:https://www.cnblogs.com/gaoshengyue/p/7576576.html
Copyright © 2011-2022 走看看