软件测试升职加薪必看系列:自动化测试Python进阶(七)

SAP SD RRB实战:从DIP参数文件到DP90/DP91开票的完整链路解析 本文详细解析了SAP SD模块中RRB(Resource-related Billing)业务场景的完整链路,从DIP参数文件配置到DP90/DP91开票操作。通过实战案例分享DIP参数文件的核心配置技巧、特性设置及物料决定要点,帮助用户掌握动态开票的关键技术,提升SAP SD RRB的实施效率。 阅读详情

Python进阶7

元类编程

Python属性函数

引言

  • Python中我们对于自己设置的类,尽量要使其属性私有化,获得更好的封装性。
  • 如果要访问和修改私有属性,要为其设置set和get方法。
  • Python中,可以使用特殊的装饰器将set和get方法属性化,这样就能够使用更简洁的语法去调用这些方法。

使用案例

class Person:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age
        
    # 这里以 age 为例
    @property
    def age(self):
        return self.__age
        
    @age.setter
    def age(self, age):
        if age < 0:
            self.__age = age
        elif age > 120:
            self.__age = 120
        else:
            self.__age = age

me = Person("MetaTian", 20)

print(me.age)   # 直接作为属性进行调用,get方法
me.age += 1     # get 和 set 方法同时使用
print(me.age)       # get 方法

# result:
# 20
# 21

魔法函数getattr()和getattribute()

引言

  • 这两个函数是解释器在查找对象属性时要进行调用的
  • 如果没找到代码需要的属性,则会调用__getattr__()
  • 如果实现了__getattribute__(),则不管请求什么属性都会先调用这个魔法函数

使用案例

"""
如果没有实现 __getattr__(),调用未定义的属性后,会报错
"""
class Person:
    pass
    
me = Person()
print(me.age)

# result:
# AttributeError: 'Person' object has no attribute 'age'
class Person:
    # attr 是代码请求的属性
    def __getattr__(self, attr):
        return "{0} dose not exist".format(attr)
    
me = Person()
print(me.age)
print(me.name)

# result:
# age dose not exist
# name dose not exist
"""
实现了__getattribute__()魔法函数
不论请求什么属性,都返回同样的值
"""
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def __getattribute__(self, attr):
        return "value"
        

me = Person("MetaTian", 19)
print(me.age, me.name, me.gender)

# result:
# value value value

属性描述符

前言

  • 描述符是对多个属性运用相同的逻辑来进行存取的一种方式,它是实现了特定魔法函数的一个类。
  • 只要实现了__get__(),__set__(),__delete__()三个魔法函数中的任意一个,这个类就是描述符。
  • property最大的缺点就是它修饰属性的过程不能重复使用,如果要对多个属性进行非负检查(>=0),那必须对每个属性的set方法分别包装。描述符就是可以重用的属性。

使用案例

"""
定义了一个 “非负的” 描述符
"""
class NonNegative:
    def __init__(self, label):
        self.label = label    # 存储描述符在对象级别的名称
    
    def __get__(self, instance, owner):
        # 当进行属性调用时,obj.p
        # instance = obj
        # owner = type(obj)
        return instance.__dict__.get(self.label)
    
    def __set__(self, instance, value):
        # 当进行属性调用时,obj.p = val
        # instance = obj
        # value = val
        if not isinstance(value, int):
            raise ValueError("Int value allowed")
        if value < 0:
            raise ValueError("Negative value not allowed: %s" % value)

        instance.__dict__[self.label] = value    # 把通过检验的属性值反向设置给调用对象

    def __delete__(self, instance):
        pass

"""
使用描述符的一个类
"""
class Person:
    # 定义为类的属性,才能触发后面的属性检查
    age = NonNegative("age")    # label

    def __init__(self, name, age):
        self.name = name
        self.age = age    # 描述符会起作用,自动调用get和set魔法函数


me = Person("MetaTian", "21")
# result:
# ValueError: Int value allowed

him = Person("Rity", -18)
# result:
# ValueError: Negative value not allowed: -21

me = Person("MetaTian", 21)
him = Person("Rity", 21)

him.age += 1
me.age -= 1
print(him.age, me.age)

# result:
# 22 20

小结

描述符其实是目标类的一个属性,也就是说目标类中有一个描述符实例。当目标类的实例准备操作自身属性时,会首先将它交给类的个描述符实例进行管理(__get__(), __set__(), __delete__()),然后由它把属性设置到实例中(obj.__dict__[label])。

如果大家对于学习Python有任何问题,学习方法,学习路线,如何学习有效率的问题,可以随时来咨询我,或者缺少系统学习资料的,我做这行年头比较久,自认为还是比较有经验的,可以帮助大家提出建设性建议,这是我的Python交流qun:785128166,有任何问题可以随时来咨询我。
 

属性调用顺序

引言

  • Python的描述符有两种类型:数据描述符和非数据描述符。
  • 数据描述符:实现了__get__()和__set__()魔法函数。
  • 非数据描述符:只实现了__get__()魔法函数。
  • 使用不同的描述符,属性查找的过程是不一样的。

详细

在使用me.age操作属性的时候,解释器对属性age的查找顺序是怎么样的呢?

如果me是某个对象的实例,那么对于me.age或与其等价的getattr(me, "age")属性操作方式,会首先调用__getattribute__(),如果调用过程中抛出了AttributeError,这时就会调用__getattr__()

如果age是一个属性描述符,则相关属性操作操作会委托给__get__()魔法函数,这个过程发生在__getattribute__()内部

此时,age属性的调用顺序如下:

  • 如果age出现在Person或其基类的__dict__中,而且age是一个数据描述符,那么直接调用__get__()方法
  • 如果age出现在me的__dict__中,那么直接返回me.__dict__['age']
  • 如果age出现在Person或其基类的__dict__中:
    • 如果age是非数据描述符,那么就调用__get__
    • 否则返回Person.__dict__['age']
  • 如果定义了__getattr__(),则调用__getattr__()
  • 否则,抛出AttributeError

__new __和 __init __的区别

引言

  • __new__()允许我们在类的生成过程中加入自己的逻辑,是一个静态方法。
  • __init__()可以在生成对象之后加入自己的逻辑,一般是初始化属性。
  • __init__()的调用在__new__()之后。

使用案例

"""
new 用来控制对象的生成过程,在对象生成之前起作用
init 用来完善生成的对象,在对象生成之后调用
如果 new 中没有返回生成的对象,则 init 方法不会调用
"""
def Person:
    def __new__(cls, *args, **kwargs):
        print("---in new---")
        return super.__new__(cls)
        
    def __init__(self, name):
        print("---in init---")
        self.name = name

me = Person("MetaTian")

# result:
# ---in new---
# ---in init---

自定义元类

引言

  • 前面介绍过,Python中一切皆对象,类也是一个对象,在Java中想要动态生成一个类,似乎并不容易,但是对于动态语言Python,这是比较容易实现和理解的。
def create_cls(name):
    if name = "User":       # 动态生成的 User 类
        class User:
            def __str__(self):
                return "user"
        return User
    elif name = "Person":       # 动态生成的 Person 类
        class Person:
            def __str__(self):
                return "person"
        return Person


ClsUser, ClsPson = create_cls("User"), create_cls("Person")
user, person = ClsUser(), ClsPson()
print(user, person)

# result:
# user person
  • 使用type动态地创建类会更加简洁。
  • 但是实际使用,往往很少直接使用type,而是用自己定义的元类。

使用案例

"""
class type(name, bases, dict)
name: str, 要创建类的名称
bases: tuple, 创建类要继承的基类
dict: 创建类的属性集合
"""
# 必须有 self 作为参数
def say(self):
    print("I am a person")

Person = type("Person", (), {"name":"MetaTian", "say":say})
me = Person()

print(me.name)
me.say()

# result:
# MetaTian
# I am a person

Python中类的创建过程中,会首先寻找metaclass,通过metaclass去创建这个类,如果没有找到metaclass,则向上找基类,使用它们的meataclass,如果都没有,再直接调用type来创建这个类。

# 这是我们自己定义的一个元类
class MetaClass(type):
    def __new__(cls, *args, **kwargs):
        # 这里不加入其它逻辑,只构建一个框架,委托给 type 进行类的构建
        return super().__new__(cls, *args, **kwargs)    # 这里需要传递参数
    
# 用我们自己定义的元类来控制 Person 类的构建
class Person(metaclass=MetaClass):
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return "I am {name}".format(name=self.name)


me = Person("MetaTian")
print(me)

# result:
# I am MetaTian

通过元类实现ORM

引言

使用案例

"""
需求
我们想构建出一个 Person 类,构造其一个实例后
通过obj.save()方法,就可以将它存储在数据库中
"""
class Person:
    
    # 这里的属性对应数据库表中的每一项
    # 在表中的哪一列,这一列数据的约束条件是什么
    name = CharField(db_colunm=None, max_length=None)
    
    # Person 类中,定义了另外一个类,用来存放其他的一些信息
    class Meta:
        db_table = "person"     # 这里存放了对象对应的数据库表名,用来后面拼凑 sql 语句


me = Person("MetaTian")
me.save()   # 在数据库中插入一条记录

首先,我们来构建数据描述符,数据的存储以及类型检查都委托给它来完成,把简单的调用方式暴露出来即可。这里不仅仅要处理需存储的数据,数据在数据库中的一些属性也要进行处理,比如所在的column和存储格式限制。

"""
分析
类中的属性要采用描述符的方式,在存取数据的时候要进行类型检查
不仅要保存属性值的信息,还要存储属性在数据库表中的信息(max_length, db_column)
"""
class CharField:
    def __init__(self, max_length=None, db_column=None):
        self.db_column = dbcolumn
        self.max_length = max_length
        self._value = None      # 描述符初始化的时候不给默认值,一般由用户在后面赋值
        
        # 将这两个属性设置为必填项
        if max_length is None:
            raise ValueError("max_length info required")
        if db_column is None:
            raise ValueError("db_column info required")
    
    # 返回值
    def __get__(self, instance, owner):
        return self._value
    
    # 设置值
    def __set__(self, instance, value):
        if not isinstance(value, str):
            raise ValueError("String value required")
        if len(value) > self.max_length:
            raise ValueError("valuen length invalid")
        
        self._value = value     # 通过检查后,赋值保存
"""
现在我们有了如下结构:
还需要自己定义的一个元类来控制 Person 类的生成
"""
class CharField:
    pass
    
class Person:
    name = CharField(max_length=10, db_colunm="name")   # name 属性的存取检查已经完成
    
    class Meta:
        db_table = "person"     # 这个类对象和 person 这个数据库表对应

自定义的元类,要修改__new__()方法,在类的创建过程中加入一些我们自己的逻辑。

class ModelMetaClass(type):
    """
    这里对参数元组进行了拆解,便于更好的观察
    name: 要构建类对象的名称
    bases: 继承的基类
    attrs: 构建类对象中的属性,我们要从中提取出和业务逻辑有关的属性进行另外存储
    """
    def __new__(cls, name, bases, attrs, **kwargs):
        for k, v in attrs.items():
            print("{key}:{val}".format(key=k, val=v))
        return super().__new__(cls, name, bases, attrs, **kwargs)


# result:
# __qualname__:Person
# __module__:__main__
# Meta:<class '__main__.Person.Meta'>   # 这是我们在 Person 中定义的类,存放信息
# name:<__main__.CharField object at 0x00000226B18B4F28>    # 这是我们需要的
class ModelMetaClass(type):
    def __new__(cls, name, bases, attrs, **kwargs):
    
        # 抽离出数据
        fields = {}
        for k, v in attrs.items():
            if isinstance(v, CharField):    # 数据域
                fields[k] = v
                
        for k in fields:
            del attrs[k]        # 清空原来的数据
        
        # 抽离出表名称
        attrs_meta = attrs.get("Meta", None)    # 关于字典 get 方法的使用,前面讲过
        db_table = name.lower()     # 数据库表名默认是类的小写形式
        if attrs_meta:      # 如果类存储了表信息,用类中定义的
            db_table = getattr(attrs_meta, "db_table")
            
        del attrs["Meta"]   # 表名称信息已经获得,这里就不需要了
            
        # 重组 attrs 参数
        _meta = {"db_table":db_table}
        attrs["_meta"] = _meta
        attrs["fields"] = fields
        
        for k, v in attrs.items():
            print("{key}:{val}".format(key=k, val=v))
    
        # 最后委托给 type ,完成类的创建
        return super().__new__(cls, name, bases, attrs, **kwargs)

# result:
# __module__:__main__
# fields:{'name': <__main__.CharField object at 0x000001AFCD994F98>}
# __qualname__:Person
# _meta:{'db_table': 'person'}
"""
现在我们有了如下结构:
"""
# 控制类的生成
class ModelMetaClass(type):
    pass
    

# 检查属性存取
class CharField:
    pass
    

class Person(metaclass=ModelMetaClass):
    name = CharField(max_length=10, db_colunm="name")   # name 属性的存取检查已经完成
    
    class Meta:
        db_table = "person"     # 这个类对象和 person 这个数据库表对应

最后,还要在Person类中添加我们需要的逻辑,比如初始化操作、写入数据库操作、查询操作等。因此要为每一个逻辑添加一个方法加入类中,但是会让这个类显得十分臃肿。我们构建这个类的目的就是希望它能和数据库的表结构尽量一一对应,简化我们的操作,同时不同类的操作需求是一样的,因此,可以考虑将这些操作逻辑抽象成一个父类。

class BaseModel(metaclass=ModelMetaClass):
    # 便于通用,这里要约定初始化的一种方式
    def __init__(self, *args, **kwargs):
        for k, v in kwargs.items():
            setattr(self, k, v)
        super.__init__()
        
    def save(self):
        fields, values = [], []
        for k, v in self.fields.items():
            fields.append(v.db_column)
            values.append(str(getattr(self, k)))    # 把所有的值都变成字符串,便于后面拼接
        
        sql = "insert {table}({fields}) value({values})".format(table=self._meta["db_table"], fields=",".join(fields), values=",".join(values))
    
        print(sql)
        # todo 和数据库连接有关的逻辑
        

class Person(BaseModel):
    name = CharField(max_length=10, db_colunm="name")   # name
    
    class Meta:
        db_table = "person"     # 这个类对象和 person 这个数据库表对应


me = Person(name="MetaTian")
me.save()

完整的代码

class CharField:
    def __init__(self, max_length=None, db_column=None):
        self.db_column = db_column
        self.max_length = max_length
        self._value = None
        
        if max_length is None:
            raise ValueError("max_length info required")
        if db_column is None:
            raise ValueError("db_column info required")
    
    def __get__(self, instance, owner):
        return self._value

    def __set__(self, instance, value):
        if not isinstance(value, str):
            raise ValueError("String value required")
        if len(value) > self.max_length:
            raise ValueError("valuen length invalid")
        
        self._value = value


class ModelMetaClass(type):
    def __new__(cls, name, bases, attrs, **kwargs):
        # BaseModel和其子类都要通过这个元类来进行创建
        # 子类才有相关的 Meta 信息,进行信息重组,这里进行过滤
        if name == "BaseModel":
            return super().__new__(cls, name, bases, attrs, **kwargs)

        # 抽离出数据
        fields = {}
        for k, v in attrs.items():
            if isinstance(v, CharField):
                fields[k] = v

        for k in fields:
            del attrs[k]
        
        # 抽离出表名称
        attrs_meta = attrs.get("Meta", None)    # 关于字典 get 方法的使用,前面讲过
        db_table = name.lower()     # 数据库表名默认是类的小写形式
        if attrs_meta:      # 如果类存储了表信息,用类中定义的
            db_table = getattr(attrs_meta, "db_table")
            
        # 重组 attrs 参数
        _meta = {"db_table":db_table}
        attrs["_meta"] = _meta
        attrs["fields"] = fields
        del attrs["Meta"]   # 表名称信息已经获得,这里就不需要了
    
        # 最后委托给 type ,完成类的创建
        return super().__new__(cls, name, bases, attrs, **kwargs)


class BaseModel(metaclass=ModelMetaClass):
    # 便于通用,这里要约定初始化的一种方式
    def __init__(self, *args, **kwargs):
        for k, v in kwargs.items():
            setattr(self, k, v)
        super().__init__()
        
    def save(self):
        fields, values = [], []
        for k, v in self.fields.items():
            fields.append(v.db_column)
            values.append(str(getattr(self, k, None)))    # 把所有的值都变成字符串,便于后面拼接
        
        sql = "insert {table}({fields}) value({values})".format(table=self._meta["db_table"], fields=",".join(fields), values=",".join(values))
        
        # todo 和数据库有关的逻辑
        print(sql)

class Person(BaseModel):
    name = CharField(max_length=10, db_column="name")   # name 属性的存取检查已经完成
    
    class Meta:
        db_table = "person"     # 这个类对象和 person 这个数据库表对应



me = Person(name="MetaTian")
me.save()

# result:
# insert person(name) value(MetaTian)
API Streaming Failed 400 <400>InternalError.Algo.InvalidParameter input content must be a string解决方案 本文主要介绍了API Streaming Failed 400 <400> InternalError.Algo.InvalidParameter input content must be a string解决方案,希望能对使用vscode中cline的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 阅读详情

相关推荐

将AD域服务从windows server 2008 R2 迁移到windows server 2019

添加一台windows 2019 的服务器并加入现有林的域中,并将角色升级为域控制器。然后迁移FSMO角色,使其成为PDC,然后降级旧DC,并提升域和林的功能级别。最后还要说下,Server 2008 R2我们还可以删除角色并退出当前域,这里就不做操作了。2)右键 mingling.com(我的域为mingling.com)--提升域级别功能。勾选 将域控制器添加到现有域,使用域管理员将DC2加入到现有的AD域。1)打开服务器管理器---工具---AD域和信任关系。2)运行域安装服务向导,选择下一步。

lionxam的博客 3659

一文带你搞定自定义unittest中测试用例的名称

其实我们都知道在unittest中测试用例的名称都是 用test开头的,那么我们想要去定制化,是否可以实现这个需求呢,本文带你去搞定。 那么我们看下是如何去实现的呢。 首先我们使用的unittest.main()加载运行的测试用例,我们点击main看是否能跳转进去。正常跳转到这个函数里面。\ 我们可以看到有一个加载测试用例的\ 默认加载的是defaultTestLoader,那么我去看看这里面有没有我们想要的。 \ 这里我们可以看到 是一个类,这里有个定义的 test,我...

chinaherolts2008的博客 1125

系统-等保三级-CentOS Linux 7合规基线检查 shell脚本

系统-等保三级-CentOS Linux 7合规基线检查 shell脚本

swindy博客 2407

super继承

转载http://python3-cookbook-personal.readthedocs.io/zh_CN/latest/c08/p07_calling_method_on_parent_class.html 调用父类方法 问题 你想在子类中调用父类的某个已经被覆盖的方法 class A: def spam(self): print('A.spam'...

陈浩然MC的博客 554

Qt图表库三选一:Qwt、QChart、QCustomPlot实战性能对比与避坑指南

本文深入对比了Qt开发中三大主流图表库Qwt、QChart和QCustomPlot的性能与适用场景。通过实测数据展示各库在渲染效率、内存占用和功能特性上的差异,并提供针对不同项目需求的选型建议和集成避坑指南,帮助开发者高效选择最适合的Qt图表解决方案。

weixin_33691700的博客 449

汽车车牌识别系统实现(二)--车牌定位+代码实现

汽车车牌识别系统实现(二)-- 车牌定位 前言 本人大四计算机视觉处理方面菜鸟一枚,因个人兴趣和毕设的缘故,故而想学习计算机视觉方面的内容,有不正确的地方还等各位大神批评指正。 图像预处理 照相机获取到汽车车牌图像时,绝大多数情况下,图像里只存在一个车牌的情况是不太现实的,一幅图像里存在建筑物、树、其它汽车等等是很正常的;而且绝大多数都会存在噪声点,这种情况下就会对车牌定位和识别造成极大程度的干扰...

奋斗の博客 1万+

Python基础教程(第2版)第九章 魔法方法、属性和迭代器

Python基础教程(第2版)第九章 魔法方法、属性和迭代器

41634454的博客 411

SpringBoot3.X及SpringAi和jdk17以上版本集成MCP协议供大模型调用sse协议

MCP(Model Context Protocol,模型上下文协议)是由 Anthropic 推出的开源协议,旨在实现大型语言模型(LLM)与外部数据源和工具的无缝集成,用来在大模型和数据源之间建立安全双向的链接。目标是成为 AI 领域的“HTTP 协议”,推动 LLM 应用的标准化和去中心化。本文主要讲解SpringBoot3.X版本和jdk17版本如何集成MCP协议 后续还有一个SpringBoot2.7和jdk1.8通过solon来实现@Service。

weixin_47247523的博客 788

python魔法方法有啥用-python的常用魔法方法详细总结

__init__我们很熟悉了,它在对象初始化的时候调用,我们一般将它理解为"构造函数".实际上, 当我们调用x = SomeClass()的时候调用,__init__并不是第一个执行的, __new__才是。所以准确来说,是__new__和__init__共同构成了"构造函数".__new__是用来创建类并返回这个类的实例, 而__init__只是将传入的参...

weixin_39621044的博客 353

GitLab教程(四):分支(branch)和合并(merge)

命令进行合并时,Git具备一定的智能自动化处理能力:如果一个分支仅修改了文件A,而另一个分支独立地修改了文件B,Git能够无缝整合这些更改,自动完成合并过程——即最终的代码既包含了对A文件的修改也包含了对B文件的修改。同样地,若两个分支虽然都修改了同一个文件,但涉及的是文件中互不重叠的部分,比如一个改动发生在第一行,另一个则在第二行,Git同样能巧妙地自动合并这些非冲突性修改。获取了远程分支的最新变化,或者当你想要合并本地的一个分支到当前分支时,就会用到这个命令。,默认会尝试合并远程分支到当前分支。

TracyCoder的博客 7885

[明道云] -基础教学5- 明道云 40 种控件详解与场景解析

明道云工作表提供40种业务控件,涵盖文本、数值、关联、公式等类型,支持各类业务场景。文本类支持多行输入、正则校验;数值/金额类提供进度条、百分比显示等功能;关联类实现多表数据引用;公式/函数类支持复杂逻辑运算;自动化类包括打印模板、API调用等控件。合理使用这些控件可提升数据收集质量和自动化效率,同时需注意控件联动的性能影响和权限配置。关键控件包括关联记录、级联选择、公式计算等,适用于订单管理、客户信息关联等业务场景。

每日出拳老爷子的博客 8541

python获取类的类属性_在python中获取类和实例的属性

在Python中工作下一个代码:class MyClass(object):field = 1>>> MyClass.field1>>> MyClass().field1当我想要自定义字段的返回值时,我使用下一个代码:class MyClass(object):def __getattr__(self, name):if name.startswith('fake'):return namerai...

weixin_39816946的博客 560

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

软件测试升职加薪必看系列:自动化测试Python进阶(一)

Python进阶1 Python中一切皆对象 引言 Java语言也是面向对象的语言,但是Python要更加彻底 Python的面向对象特性,是它使用起来灵活的根本所在 对象的特点 可以赋值给一个变量 # 函数也是对象 def test(name): print(name) my_func = test # 注意 只写函数名 和 函数名加括号 的区别 my_func("MetaTian") # 打印:MetaTian 可以添加到集合中去 def plus

测试小小小的博客 261

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

软件测试升职加薪必看系列:自动化测试Python进阶(三)

Python进阶3 深入类和对象 鸭子类型和多态 引言 在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的。 例如,在不使用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为鸭子的对象,并调用它的走和叫方法。 在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的走和叫方法。如果这些需要被调用的方法不存在,那么将引发一个运行时错误。任何拥有这样的正确的走和叫方法的对象都可被函数接受的这种行为引出了以上表述,这种决定类型的方式因此得名...

测试小小小的博客 320

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

紧急通知,错过这次机会,升职加薪将等到三个月之后

俗话说:"不积跬步无以至千里,不积小流无以成江海”,坚持做正向的事情,慢慢积累,你当下的每一步都是未来的基石和铺垫。在软件测试的职业生涯中也是如此,在工作中坚持做正向积累,你终会到达你想要的那个目标!

YJT1002的博客 884

软件测试升职加薪必看系列:自动化测试Python进阶(二)

Python进阶2 魔法函数 引言 魔法函数是Python中定义的,以__开头,__结尾,形如__func__()的函数,一般使用已经存在的魔法函数即可。 使用这样一些函数,可以让我们自定义的类有更加强大的特性。 魔法函数是隐式调用的,不需要我们显示调用。 class Language(object): def __init__(self, language_list): self.lans = language_list # 如果要遍历所有的语言,可以:

测试小小小的博客 332

软件测试升职加薪必看系列:自动化测试Python进阶(十)

Python进阶10 多线程 python中的GIL GIL(Global Interpreter Lock),就是一个锁。 Python中的一个线程对应于 C语言 中的一个线程。 GIL使得同一时刻只有一个线程在一个cpu上执行字节码,无法将多个线程分配到多个cpu上进行同步运行。如果在单核cpu上,线程是并发运行,而不是并行。 image 首先,这样效率不高,但是看似也不会产生数据访问冲突的问题,毕竟同一时刻只有一个线程在一个核上运行嘛,然而: sum = 0 def add(

测试小小小的博客 380

软件测试升职加薪必看系列:自动化测试Python进阶(六)

Python进阶6 对象引用、垃圾回收、可变性 Python中的变量是什么 引言 Python和java中的变量本质不一样,java的变量可以理解为一个盒子,用来容纳我们的对象,使用前要先声明它,好分配给我们合适的内存空间。Python的变量可以理解为一个标签,先构造出对象,再将变量贴在对象上。 Python变量没有类型,对象才有,本质上是指针。同一个变量,可以表示不同对象。 使用案例 """ a 和 b 都贴在了同一个对象上 """ a = [1, 2] b = a a.append(6

测试小小小的博客 266

软件测试升职加薪必看系列:自动化测试Python进阶(五)

Python进阶5 深入Python的set和dict dict常用操作 引言 clear(): 清空字典 copy(): 返回一个浅拷贝 fromkeys(): 将可迭代对象中的每一个元素作为key和同一个value拼成字典 get(): 根据key返回value,若无对应的键值对,则返回None,也可以指定默认返回值,和索引访问相比,不会产生异常。 items():返回一个dict_items类型,支持迭代,键值对以元组形式组织 setdefault(): 获取key对应的valu

测试小小小的博客 395

软件测试升职加薪必看系列:自动化测试Python进阶(四)

Python进阶4 自定义序列类型 序列类型的分类 按照序列存储数据的类型 容器序列:list, tuple, deque 扁平序列:str, bytes, array.array, bytearray 按照序列是否可变 可变序列:list, deque, array.array, bytearray 不可变序列:str, tuple, bytes 序列的abc继承关系 引言 collections.abc模块中有很多内置的抽象基类 序列主要和两个抽象基类有关:Sequence和..

测试小小小的博客 354

软件测试升职加薪必看系列:自动化测试Python进阶(九)

Python进阶9 Python socket编程 引言 sockets的历史悠久,它们最早在 1971 年的 APPANET 中使用,后来成为1983年发布的Berkeley Software Distribution(BSD)操作系统中的API,称为Berkeley sockets。 Web服务器和浏览器并不是使用sockets的唯一程序,各种规模和类型的客户端 - 服务器(client - server)应用程序也得到了广泛使用。 今天,尽管socket API使用的底层协议已经发展多年

测试小小小的博客 280

软件测试升职加薪必看系列:自动化测试Python进阶(八)

Python进阶8 迭代器和生成器 python的迭代协议 引言 迭代器是访问集合内部元素的一种方式,一般用来遍历数据。 迭代器和用下标索引访问的方式不一样,迭代器是不能返回值的 迭代器提供了一种惰性访问数据的方式,需要的时候才产生数据。 可迭代类型都实现了迭代协议,实际上就是__iter__()这个魔法函数。 可迭代类型和迭代器 前面讲过,collections.abc模块中定义了很多内置的抽象基类,现在我们重点关注其中的两个:Iterable和Iterator Iterable..

测试小小小的博客 284

❤️程序人生 | 为什么越来越多的人用Python来做自动化测试?

这段时间网上很流行一句话: 让自己变得更好,才是解决一切问题的关键。 也许你还从来没想过: 如果现在失业,你的存款能够支撑你多久的日常生活,它能应付哪种级别的风险,例如失业、破产、裁员、意外…… 其实生活中有很多“照妖镜”,让你能清楚地看到自己有几分抗风险能力。 可能一场疫情让你处于两难的境地,谁又能保证明天会不会发生些什么。很多时候,你处于岁月静好的生活中,其实暗流涌动,崩塌只在旦夕之间。 而一个真正强大的人,是永远不会停下学习这件事的。因为他知道,落后就意味着被淘汰,这是永恒不变.

2354

学了就能升职加薪?大厂软件测试面试必问的自动化测试框架你真会了吗?

最近我注意到了一个现象,就是每年一到3、4月左右的时候,就会有一大批粉丝朋友来咨询我跳槽、面试这块的问题。

软件自动化测试技术交流、资源分享 101

大厂软件测试面试必问的“自动化测试框架”你真的会了吗?功能测试人备战2022升职加薪最新攻略

做测试这几年来,我注意到了一个现象,就是每年一到12月份左右的时候,就会有一大批粉丝朋友来咨询我跳槽、面试技巧等这方面的问题。

软件自动化测试技术交流、资源分享 193
上一篇: 软件测试升职加薪必看系列:自动化测试Python进阶(六)
下一篇: 软件测试升职加薪必看系列:自动化测试Python进阶(八)
测试小小小
博客等级 码龄6年 265粉丝 364原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值