我的Python3学习笔记(3):面向对象

Python学习笔记-面向对象 Python面向对象 阅读详情

面向对象

模块

导入

Python导入有两种形式

一是importmodule,这种形式还得写全名。不同于Java

例如:

import cmath
cmath.sqrt

另一种是

from module import function.
from somemodule import somefunction, anotherfunction, yetanotherfunction

这种情况下就可以直接写函数名。

模块别名

>>>import math as foobar
>>>foobar.sqrt(4)
2.0


函数别名

>>>from math import sqrt as foobar
>>>foobar(4)
2.0

重新加载

importimp
reload(module)


类

类创建

__metaclass__= type # Make sure we get new style classes
 
classPerson:
       def setName(self, name):
              self.name = name
       def getName(self):
              return self.name
       def greet(self):
              print "Hello, world! I'm%s." % self.name

 

1,最上面的赋值是用来把这个类变成Python新式类,另外也可以继承一个新式类来把这个类变成新式类。Python 3中都是新式类,因此没有这个问题。

例如:

class Person(object)

2,每一个实例方法第一个参数必须是self。

3,实例变量加入对象的规则是:第一次访问这个变量时,把这个变量加入这个类中。动态语言中的类就像原型编程中的对象槽。比如这个里面没有任何的实例变量的声明。

构造方法

class ClassName(object):
       """docstring forClassName"""
       def __init__(self, arg):
              super(ClassName, self).__init__()
              self.arg = arg

 

1,如同Java一样,Python覆盖一个有参数的构造方法的时候必须显示调用父类的构造方法。使用super。

2,注意形式:这个函数前后都是两个下划线。

构造器重载

Python不支持方法重载,因为Python是动态类型语言,所以方法重载可以通过缺省参数值来实现。如果真要实现方法重载,可以使用多参数。

调用父类构造器
使用非绑定方法

class SongBird(Bird):
       def __init__(self):
              Bird.__init__(self)
              self.sound = 'Squawk!'
       def sing(self):
              print self.sound

 

这里直接调用了父类的构造器,但是由于这个时候并没有绑定任何的实例,因此这个时候可以提供子类对象self。也就是说吧父类的构造器绑定到子类对象上面。

Super

class ClassName(object):
       """docstring forClassName"""
       def __init__(self, arg):
              super(ClassName, self).__init__()
              self.arg = arg


这种方法首先给super绑定子类和子类对象,然后就可以调用init方法。

访问控制

Python中使用前缀来表示其访问控制,不以下划线开头的实例变量都是共有的。

>>>foo.name
'LukeSkywalker'
>>>bar.name = 'Yoda'
>>>bar.greet()
Hello, world! I'm Yoda.

私有化

一个类中的实例变量如果是双下划线开头的,那么这个实例变量就是私有的,访问他们会出错。

class Secretive:
       def __inaccessible(self):
              print "Bet you can't seeme..."
       def accessible(self):
              print "The secret messageis:"
              self.__inaccessible()

getter和setter
使用描述器

>>>class Rectangle(object):
    def __init__(self):
        self.width = 0
        self.height = 0
    def setSize(self, size):
        self.width, self.height = size
    def getSize(self):
        return self.width, self.height
    size = property(getSize, setSize)
 
   
>>>r = Rectangle()
>>>r.width = 2
>>>r.height = 5
>>>r.size
(2,5)
>>>r.size = 10,20
>>>r.size
(10,20)
 


这种方法就是结合访问器方法和property函数来实现一个属性的getter和setter,如果属性是私有的。那么size就可以以公有的形式来访问了。

实现方法

class Rectangle(object):
    def __init__(self):
        self.width = 0
        self.height = 0
    def setSize(self, size):
        self.width, self.height = size
    def getSize(self):
        return self.width, self.height
    size = property(getSize, setSize)


 

在这个代码中实际上使用了描述器,一个描述器就是一个具有__get__和__set__的类。这样对于这个对象的任何任何的访问都会把它转义到这个描述器中的__get__和__set__方法中。

这儿property其实是一个类,

def prop(getter, setter, deleter):
    class PropDesc:
        def __get__(self, instance, owner):
            return getter(instance)
        def __set__(self, instance, value):
            setter(instance, value)
        def __delete__(self, instance):
            deleter(instance)
           
    return PropDesc()


可以看到这个函数返回了一个对象,这个对象就是一个描述符,借助于描述符的简便的访问规则。这个属性访问的时候就想一个普通属性那样自然。

使用修饰器

class Ball:
    def __init__(self, radius):
        if radius <= 0:
            raise ValueError('必須是正數')
        self.__radius = radius
   
    @property
    def radius(self):
        return self.__radius
       
    @radius.setter
    def radius(self, radius):
        self.__radius = radius
   
    @radius.deleter
    def radius(self):
        del self.__radius


 

根据修饰器的规则:property是一个函数,因此在@property出现的地方其实是创建了一个对象radius,然后后面的两个修饰器则是使用了这个对象,并且把他们变成了property的一个函数。

实例方法的动态性

1,一个实例方法既可以被重新赋值
>>>class Class:
                     def method(self):
                            print 'I have aself!'
>>>def function():
                     print "Idon't..."
>>>instance = Class()
>>>instance.method()
Ihave a self!
>>>instance.method = function
>>>instance.method()
Idon't...


2,实例方法也可以赋值给其他的方法

>>>class Bird:
       song = 'Squaawk!'
       def sing(self):
              print self.song
>>>bird = Bird()
>>>bird.sing()
Squaawk!
>>>birdsong = bird.sing
>>>birdsong()
Squaawk!


类方法

1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数;

2)从第1条,静态方法是无法访问实例变量的,而类成员方法也同样无法访问实例变量,但可以访问类变量;

3)静态方法有点像函数工具库的作用,而类成员方法则更接近类似Java面向对象概念中的静态方法,也就是说静态方法使用的使用Python类的命名空间的作用。

例如:

class MyClass:
       @staticmethod
       def smeth():
              print 'This is a static method'
       @classmethod
       def cmeth(cls):
              print 'This is a class method of',cls
 


4)。同Java,Python中的类方法不会被继承。

类变量

在类体中声明的变量就是类变量。类变量和Java中的类变类一致,但是Python中比较混淆。尤其是类变量必须通过self来访问,也可以使用类名来引用。

注意:在实例方法中调用类变量的时,必须加上self。

 

例如:

>>>class Bird:
       song = 'Squaawk!' #1
       def sing(self):
              print self.song #2
>>>bird = Bird()
>>>bird.sing()
Squaawk!
>>>Bird.sing()


 

类变量在类本身和类实例间共享。

class MemberCounter:
       members = 0
       def init(self):
              MemberCounter.members += 1
>>>m1 = MemberCounter()
>>>m1.init()
>>>MemberCounter.members
1
>>>m2 = MemberCounter()
>>>m2.init()
>>>MemberCounter.members
2


调用

类层次方法既可以用对象引用来调用它,也可以使用类来调用调用结果都是一样的。

魔法方法

序列和字典

字典和序列都是根据一个规则来声明的,也就是按照鸭子类型的说法:如果他有鸭子的行为,那么他就是一个鸭子。如果实现下面的方法,那么这个类就是一个序列

1,__len__

返回这个集合中元素的个数,如果返回值是0,那么表示这个集合没有任何元素,并且在boolean环境下他表示的是False。

2,__getitem__(self,key)

得到指定键的值。对于序列来说他可能是一个数值,对于一个字典来说这个键可能是任何可以作为键的值。

3,__setitem__(self,key,value)

同上,只是这个是用来设置这个序列的一个值。

4,__delitem__(self,key)

这个方法用来删除一个元素。

Python对象属性

dict字典

这些对象的属性方法都是默认和Python对象中的__dict__打交道,也就是说他们都是在操作__dict__这个字典。

 

例如:            

>>>class Foo(object):
...     def __getattr__(self, name):
...         return "Value of %s" % name
>>>foo = Foo()
>>>foo.just_this = "Some value"
>>>foo.just_this
'Somevalue'
>>>foo.something_else
'Value ofsomething_else'


__getattribute__(self,name)

Python2.2 及之后版本中,您可以选择使用 .__getattribute__() 方法,代替具有类似名称且易被混淆的老式.__getattr__() 方法。如果使用的是新式的类(一般情况下总是如此),您就可以这样做。.__getattribute__()方法比它的同类方法更为强大,因为不管属性是不是在 obj.__dict__ 或 obj.__slots__ 中定义的,它将拦截所有 属性访问。使用.__getattribute__() 方法的一个缺点是,所有访问都需通过该方法。如果您使用这种方法,并希望返回(或操作)属性的 “real” 值,则需要进行少量特殊的编程:通常可通过对超类(一般为 object)调用 .__getattribute__() 实现。例如:

 

>>>class Foo4(object):
...     def __getattribute__(self, name):
...         try:
...             returnobject.__getattribute__(self, name)
...         except:
...             return "Value of %s" %name
...
>>>foo4 = Foo4()
>>>foo4.x = 'x'
>>>foo4.x
'x'
>>>foo4.y
'Value of y'


__getattr__(self,name)

如果把一个对象看做一个属性槽,那么这个就是用来得到name的属性。不同于__setattr__的是__getattr__值拦截没有在对象中定义的属性。也就是说__getattr__是用来收拾烂摊子的。

 

class Foo(object):
       def __init__(self):
              self.name="ssj"
 
       def __getattr__(self, name):
              return "Value of %s" %name
 
>>>import Main
>>>foo = Main.Foo
>>>foo = Main.Foo()
>>>foo.name
'ssj'
>>>foo.time
'Valueof time'
>>> 


__setattr__(self,name)

 

class Rectangle:
       def __init__(self):
              self.width = 0
              self.height = 0
       def __setattr__(self, name, value):
              if name == 'size':
                     self.width, self.height =value
              else:
                     self.__dict__[name] = value
       def __getattr__(self, name):
              if name == 'size':
                     return self.width,self.height
              else:
                     raise AttributeError


 

__setattr__会拦截所有的属性访问请求,因此:不能仅仅关注访问的属性是size的时候,还有注意如果属性不是size,那么把他放到这个对象的属性槽里面。如果不实现加入__dict__这一步,甚至连实例属性都没法声明,因为每次要设定实例属性的时候都会访问__setattr__,但是他没有实现任何的方法,因此会抛出异常。

class Foo(object):
       def __init__(self):
              self.name="ssj"
 
       def __getattr__(self, name):
              return "Value of %s" %name
 
       def __setattr__(self,name,value):
              print("__setattr__ in theway!!!")


 

结果:

>>>foo = Main.Foo()
__setattr__in the way!!!
>>>foo.name
'Valueof name'
>>>foo.name = "ssj"
__setattr__in the way!!!
>>>foo.name
'Valueof name'


可以看到name这个属性并没有在对象中,因为__setattr__被覆盖。

__delattr__(self,name)

删除一个属性。

hasattr函数

这个函数和__getattr__协同工作,当__getattr__放回值时,那么判断为True,如果__getattr_抛出AttributeError,那么结果为False。但是如果抛出其他异常hasattr也会抛出异常。

默认情况

__slots__

这个类中的元组规定了可以加入对象__dict__的名称,也就是说只有在

__slots__中出现的属性名称才能加入到__dict__中。

 

>>>class Foo2(object):
...     __slots__ = ('just_this')
...     def __getattr__(self, name):
...         return "Value of %s" % name
>>>foo2 = Foo2()
>>>foo2.just_this = "I'm slotted"
>>>foo2.just_this
"I'mslotted"
>>>foo2.something_else = "I'm not slotted"
AttributeError:'Foo' object has no attribute 'something_else'
>>>foo2.something_else
'Valueof something_else'


可以看到,这个并没有影响__getattr__的使用,仅仅是使得__setattr__的执行不成功。

结合使用 .__setattr__ 和 .__slots__

>>>class Foo3(object):
...     __slots__ = ('x')
...     def __setattr__(self, name, val):
...         if name in Foo.__slots__:
...             object.__setattr__(self, name,val)
...     def __getattr__(self, name):
...         return "Value of %s" % name
...
>>>foo3 = Foo3()
>>>foo3.x
'Valueof x'
>>>foo3.x = 'x'
>>>foo3.x
'x'
>>>foo3.y
'Valueof y'
>>>foo3.y = 'y'   # Doesn't do anything, butdoesn't raise exception
>>>foo3.y
'Value of y'


迭代器

迭代器是一个有next方法的对象(在Python3中迭代器对象应该实现__next__方法)。迭代器对象应该每次放回下一个对象,如果没有下一个对象放回,那么应该抛出StopIteration异常表示结束。

 

一个类的__iter__方法用来放回迭代器。

如:

classFibs:
       def __init__(self):
              self.a = 0
              self.b = 1
       def next(self):
              self.a, self.b = self.b,self.a+self.b
              return self.a
       def __iter__(self):
              return self


迭代器到列表

调用list方法可以把一个迭代器装换成列表。

>>>class TestIterator:
       value = 0
       def next(self):
              self.value += 1
              if self.value > 10: raise StopIteration
              return self.value
       def __iter__(self):
              return self
              ...
>>>ti = TestIterator()
>>>list(ti)
[1, 2, 3, 4, 5, 6, 7, 8,9, 10]


描述器

描述符是吧一个对象变成一个操作和基本类型相同的方法。因此这样的对象既可以像普通对象那样访问,又可以借组于强大的类定义各种使用这个对象的方法。得到的结果就是一个描述符。

 

例如:

class Descriptor:
    def __get__(self, instance, owner):
        print(self, instance, owner)
    def __set__(self, instance, value):
        print(self, instance, value)
    def __delete__(self, instance):
        print(self, instance)
 
class Some:
    x = Descriptor()

 

使用:

s =Some()

s.x

s.x= 10

dels.x


传统的对象都是用来引用他的属性的,但是这儿的x虽然也是一个对象,但是他的使用就好像一个基本类型的实例变量一样。

这些对于x的访问其实就是

s =Some()
Some.__dict__['x'].__get__(s,  Some);
Some.__dict__['x'].__set__(s,  10);
Some.__dict__['x'].__delete__(s);

描述器和__getattr__类方法的区别

描述器是用来规定一个类的对象本身被存取的时候所发生的动作。而__getattr__则规定的是一个类的实例属性访问的时候的动作。比如一个对象如果同时定义了这两个方法的时候.

class Difference(object):
    def __get__(self, instance, owner):
        print("__get__")
 
    def __set__(self, instance, value):
        print("__set__")
 
    def __delete__(self, instance):
        print("__delete__")
 
    def __getattr__(self,name):
        print("__getattr__")
 
    def __setattr__(self,name,value):
        print("__setattr__")
 
class MyWapper(object):
    d = Difference()
 
m =MyWapper()
m.d
m.d= 10
delm.d
m.d.sjsjjs
m.d.sjsjshs=10
delm.d.sjhjhshjs
结果
__get__
__set__
__delete__
__get__


__call__()

__call__方法就是让一个对象成为可执行的,也就是说可以按照函数那样的语法来调用。

class Some:
    def __call__(self, *args):
        for arg in args:
            print(arg, end=' ')
        print()
 
s =Some()
s(1)
s(1,2)
s(1, 2, 3)


继承内建类

在新版Python中可以继承内建类,这样就可以方便的建立一个列表或者字典了。

class CounterList(list):
       def __init__(self, *args):
              super(CounterList,self).__init__(*args)
              self.counter = 0
       def __getitem__(self, index):
              self.counter += 1
              return super(CounterList,self).__getitem__(index)


Monkey Patch

由于动态语言中的对象个作用域的动态性,我们可以在代码中动态的改变一个属性,方法或者函数。事实上在Ruby,Python和其他的动态语言中。对象和作用域都是一个属性槽。因此改变他们也没什么难的。

继承

class Filter:
       def init(self):
              self.blocked = []
              def filter(self, sequence):
                     return [x for x in sequence if x not in self.blocked]
class SPAMFilter(Filter): # SPAMFilter is a subclass of Filter
def __init__(self): # Overrides init method from Filter superclass
       self.blocked = ['SPAM']


多继承

一个类可以继承多个父类,如果多个方法有重名。那么使用在前面的类的方法。

对象创建

>>>foo = Person()
>>>bar = Person()
>>>foo.setName('Luke Skywalker')
>>>bar.setName('Anakin Skywalker')
>>>foo.greet()
Hello,world! I'm Luke Skywalker.
>>>bar.greet()
Hello, world! I'm AnakinSkywalker.


异常

自定义异常类

class SomeCustomeException(Exception):pass;


捕获异常

try:
       x = input('Enter the first number: ')
       y = input('Enter the second number: ')
       print x/y
exceptZeroDivisionError:
       print "The second number can't bezero!"


Python中的异常没有参数,如果要重新抛出,那么直接使用raise就可以:

class MuffledCalculator:
       muffled = False
       def calc(self, expr):
              try:
                     return eval(expr)
              except ZeroDivisionError:
                     if self.muffled:
                            print 'Division byzero is illegal'
                     else:
                            raise


多个Except

try:
       x = input('Enter the first number: ')
       y = input('Enter the second number: ')
       print x/y
except ZeroDivisionError:
       print "The second number can't bezero!"
except TypeError:
       print "That wasn't a number, was it?"


多个Exception

try:
       x = input('Enter the first number: ')
       y = input('Enter the second number: ')
       print x/y
except(ZeroDivisionError, TypeError, NameError):
       print 'Your numbers were bogus...'


捕获异常对象

try:
       x = input('Enter the first number: ')
       y = input('Enter the second number: ')
       print x/y
except(ZeroDivisionError, TypeError), e:
       print e


全捕获

try:
       x = input('Enter the first number: ')
       y = input('Enter the second number: ')
       print x/y
except:
       print 'Something wrong happened...'


else子句

while True:
       try:
              x = input('Enter the first number:')
              y = input('Enter the secondnumber: ')
              value = x/y
              print 'x/y is', value
       except:
              print 'Invalid input. Please tryagain.'
       else:
              break


finally子句

try:
       1/0
except NameError:
       print "Unknown variable"
else:
       print "That went well!"
finally:
       print "Cleaning up."




        
[Python] Python学习笔记:面向对象 慕课北京大学陈斌老师python课 学习笔记 面向对象 阅读详情

相关推荐

ERA5 数据集下载(2025最新 可运行)

众所周知,ERA5数据集经过了更新,尤其是在API访问和下载方式上发生了变化。2025年版的ERA5数据集为气象研究人员提供了更高质量的历史气象数据。本文将介绍如何通过新的API接口下载最新的ERA5数据集。

m0_72141699的博客 3591

Python3----------抽象(多态、封装、继承等)

多态、封装、继承等使用

weixin_44119674的博客 500

昇腾Ascend310b部署deepseek-r1-7b的学习记录

9.鲲鹏服务器+昇腾卡(Atlas 300I pro)搭建DeepSeek-R1-Distill-Qwen-7B(自己存档详细版)5.如何使用昇腾Ascend 300I Pro 310P芯片 单卡运行DeepSeek-R1-Distilled-Qwen-7B。6.鲲鹏服务器+昇腾卡(Atlas 300I pro)搭建DeepSeek-R1-Distill-Qwen-7B。7.鲲鹏+昇腾部署DeepSeek-R1-Distill-Qwen-32B+Open-webui。

maken 2369

学习笔记:Python3 面向对象

仅为个人查阅使用,如有错误还请指正。 面向对象编程就是一种程序设计思想。把对象当作程序的基本单元,一个对象包含了数据和操作数据的函数。 这种设计思想是从自然界中来的。因为在自然界中,类(Class)和实例(Instance)的概念是很自然的。Class是一种抽象概念,比如我们定义一个运动员类:Class-Player,是指运动员这个概念,而实例(Instance)则是一个个具体的Play...

weixin_30367945的博客 162

数十个锂电池充放电电路,锂电池充放电芯片

关乎锂电池供电的产品,在锂电池上,需要三个电路系统:1,锂电池保护电路,2,锂电池充电电路,3,锂电池输出电路。 内容目录: 单节的锂电池保护电路单节为3.7V锂电池(也叫4.2V)和3.8V锂电池(也叫4.35V) 单节的锂电池充电电路即锂电池保护板 单节的锂电池输出电路锂电池转换稳压输出为:1.2V,3.3V,5V,12V等等 两节的锂电池保护电路两节串联7.4V锂电池(也叫8.4V) 两节的锂电池充电电路即两节锂电池保护板 两节...

kuakewei123的博客 1万+

五、2K0300 久久派开发板的GPIO控制与Shell脚本自动化实战

本文详细介绍了基于龙芯2K0300处理器的久久派开发板的GPIO控制方法,通过sysfs文件系统实现LED控制和传感器读取。重点讲解了Shell脚本自动化实战,包括LED闪烁、流水灯效果和传感器数据采集,为物联网项目开发提供完整解决方案。

silver的专栏 687

Python3.6学习笔记总结3:面向对象编程

面向对象编程 面向对象编程 Object Oriented Programming 简称 OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。 而面向对象的程序设计把计算...

京Python 221

Aloudata 荣登“数智技术系列榜单”和“数据智能服务商 TOP30”

持续助力各行业数智化先进企业突破数据管理技术瓶颈,以更加敏捷、精准和可靠的数据交付驱动企业业务创新与经营提效

Aloudata的博客 666

Python 3 学习笔记:面向对象编程

概述 面向对象编程(Object Oriented Programming,即 OOP),是一种程序设计思想,比面向过程编程更加灵活,更易扩展。 Python 在设计的时候就是按照面向对象编程的思想设计的,像我们前面学过的各种数据类型,如字符串、列表、字典等都是一个个对象,它们都具有各自的属性和行为。 面向对象编程就是将客观存在的事物,总结提炼出它们各自的属性与行为,然后通过编程的方法形成一个模版...

boqia3649的博客 214

【基金量化研究系列】基金绩效归因模型——Brinson多期归因模型

文章目录1. 引言2. Brinson单期归因模型2.1 模型框架2.2 公式推导3. Brinson多期归因模型3.1 模型框架3.2 公式推导4. Brinson模型的应用场景4.1 基金组合归因4.2 基金经理能力刻画4.3 大类资产配置应用5. 模型的实现与实证案例研究写在最后 1. 引言 在 2. Brinson单期归因模型 2.1 模型框架 wp wb rp 组合收益:wp rp 择股收益:wb rp rb 择时收益:wp rb 基准收益:wb rb 2.2 公式推

Mikey_Sun的博客 1万+

资产监测设备中130dBm的GPS信号注入天线端口,C/N0一般是多少?

笔者的团队一直从事于资产监测设备的开发,在开发过程中,涉及到很多细节的问题,针对新入职的同事来说较为陌生。同时,在团队外,还有需要对智能硬件终端开发感兴趣的用户。基于此背景下,笔者将在下面的内容主要介绍资产监测设备以及对设备中的GPS相关的问题:130dBm的GPS信号注入天线端口,C/N0一般是多少?作出详细的解答。 资产监测设备概述: 资产监测设备是基于物联网通信技术基础上的智能硬件终端,其主要作用是帮助用户监测资产在仓库、运输途中、交付整个流通环节中,提供资产的实时位置与状态参数。用户只需要登录资产

瑞奇聊通信模组 1229

python3学习笔记:初探面向对象

面向对象编程(oop)是将数据和对数据的操作行为放在一起 三大特性:封装,继承,多态 封装:把客观事物封装为抽象的类,把数据和数据操作方式放在一起,只让信任的类和对象操作 继承:子类继承父类的属性 多态:同一个类的实例对同一个方法有不同的表现形式 继承的书写: class people: pass class human(people) pass @property的使用 把对函数的调用改成了对...

Whystarta_z的博客 249

【赛题解析&命令脚本配置】2023年全国职业院校技能大赛GZ073网络系统管理赛项赛题第9套模块A:网络构建 & (三)无线网络配置+(四)出口网络配置-命令配置

【赛题解析&命令脚本配置】2023年全国职业院校技能大赛GZ073网络系统管理赛项赛题第9套模块A:网络构建 & (三)无线网络配置+(四)出口网络配置-命令配置

君逍遥o 1017

Python基础学习笔记——面向对象(3):面向对象的特点、继承

面向对象 面向对象的特点 面相对想的三大特性:封装、继承、多态 封装 通俗理解:把属性和方法放到类里面的操作可以认为是封装,封装还可以控制属性和方法的访问权限,比如:把方法改成私有的。 将数据及相关操作打包在一起; 支持代码复用。 继承 定义:子类(subclass)借用父类(superclass)的行为。子类继承父类,可以直接使用父类的属性或者方法。 只能继承公有属性和公有方法,一个子...

鬼义虎神的学习笔记 271

深度学习工具包 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&#39;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(&#39;DeepLearnToolbox&#39;));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(&#39;state&#39;,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&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,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 = &#39;sigm&#39;;%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, &#39;Too big error&#39;);```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(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;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)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;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, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% 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&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 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, &#39;Too big error&#39;);```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(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % 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, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);%% 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(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Python3:面向对象编程学习笔记(1)

面向对象设计(笔记) 面向对象 对象和类 指定属性和行为 隐藏细节并且创建公共接口 组合和继承 一、面向对象 在软件开发中,对象通常不是实体的,而是实体的东西的模型,这些模型可以做特定的事情并且特定的事情可以作用于它们身上。正式的讲,对象是一个数据以及相关行为的集合。 面向简单的意思是指向。所以面向对象简单的意思就是“功能上指向建模对象”。 二、对象和类 一个对象是一个有着相应行为的数据的集合。在面向对象建模中,用于各种对象的术语叫做类。 类描述了对象,它们就像是创建对象的模板。 关联是把两个类联系起来最基

boweno的博客 212

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Python学习笔记:面向对象编程(3)

前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖子,廖雪峰的课程连接在这里:廖雪峰 Python的相关介绍,以及它的历史故事和运行机制,可以参见这篇:python介绍 Python的安装可以参见这篇:Python安装 Python的运行模式...

去向前方的博客 668

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【Python】学习笔记——-8.3、面向对象高级编程:3.多重继承

继承是面向对象编程的一个重要的方式,因为通过继承,子类就可以扩展父类的功能。 回忆一下Animal类层次的设计,假设我们要实现以下4种动物: Dog - 狗狗;Bat - 蝙蝠;Parrot - 鹦鹉;Ostrich - 鸵鸟。 如果按照哺乳动物和鸟类归类,我们可以设计出这样的类的层次: 但是如果按照“能跑”和“能飞”来归类,我们就应该设计出这样的类的层次:

你只管努力, 542

python云计算开发技术_云计算开发学习笔记:Python3 面向对象技术简介

来源:TechWeb.com.cnPython从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。本章节我们将详细介绍Python的面向对象编程。如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程。接下来我们先来简单的了解下面向...

weixin_39951295的博客 77

Python3:面向对象编程学习笔记(2)

Python对象 ###创建Python类 ###模块和包

boweno的博客 221

Python程序设计之面向对象程序设计(2)

1.关于属性 类中的属性与普通变量不同,Python2.x中通过property()函数或者@property来声明一个属性,不用显性声明就可以通过对属性的重新赋值,来隐藏对象的原有属性值,会创建一个新值,但不会覆盖原有对象的属性值,但Python3.x中需要显性声明属性值的调用状态,才可有相应操作。 ①只能读取属性值的案例 class myClass5: def __init__(sel...

QinHsiu的博客 874

Python学习笔记大总结(我把我所有python笔记做了总结和学习顺序,点击即可进入相关博客。希望可以便于你们阅读)

这里写目录标题第一章:Python语法基础第二章:Python控制语句第三章:Python函数第四章:Python文件使用第五章:面向对象程序设计 不足的我会后续慢慢补充到该博客里 第一章:Python语法基础 (1)Python数据类型(整数,浮点数,复数,字符串,format()用法)(超详细笔记) (2)组合数据类型之序列类型(包含元组,列表,字符串)(Python学习笔记) (3)组合数据类型之集合类型(学习笔记)(Python) (4)(Python)组合数据类型之字典类型和操作(学习笔记) 第二

不吃辣的IT男 3万+

Python入门:Python3 面向对象全面学习教程

Python入门:Python3 面向对象全面学习教程,本文全面解析Python3面向对象编程,涵盖核心概念、语法与技巧。先介绍类、对象、方法、继承等基础概念,再讲解类的定义与实例化,包括构造方法__init__()及self的作用。还阐述了类的属性(类变量、实例变量、私有属性)和方法(实例方法、私有方法),详解继承机制(单继承、多继承)、方法重写与super()函数,以及类的专有方法与运算符重载,帮助读者掌握这一编程范式,提升代码质量与开发效率。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 21万+

3.9 Python3 面向对象

本文详细介绍了Python面向对象编程的核心概念和应用。主要内容包括:1)面向对象基本概念(类、对象、封装、继承、多态)及其优势;2)Python类的定义(构造函数、类属性、实例属性、访问控制);3)类方法类型(实例方法、类方法、静态方法)和特殊方法;4)继承机制(单继承、方法重写、MRO顺序)和多继承问题;5)类属性和方法的进阶使用(属性装饰器、描述符协议)。文章通过丰富的代码示例展示了Python面向对象编程的特性,包括动态属性、方法重载、抽象基类等高级特性,是一份全面的Python OOP实践指南。

weixin_40978412的博客 1900

Python3 面向对象

类(Class):用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。类中定义的函数。类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。类变量或者实例变量用于处理类及其实例对象的相关的数据。如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。定义在方法中的变量,只作用于当前实例的类。

b8977的博客 923
上一篇: 我的Python3学习笔记(2):python函数式编程
下一篇: 动态语言比较学习--基础
ssjssh
博客等级 码龄15年 12粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值