前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习之Python基础(二)

机器学习之Python基础(二)

作者头像
企鹅号小编
发布2018-01-15 09:49:43
6910
发布2018-01-15 09:49:43
举报
文章被收录于专栏:编程编程

标题

面向对象

装饰器

1

首先举一个创建类的例子

class是声明类的关键字,human是类名,括号里的object是继承的父类(在Python2中如果无继承任何新式类,则为旧式类,其中object是新式类的基类)。Is_Animal是类变量,所有的类实例共享该变量,访问类变量可以直接通过类名而不需要实例化。self.name是类的一个属性,而self指向当前的类的实例对象,因此类的不同实例对象的属性可以有不同的取值。有self参数的函数说明该方法必须要实例后才可以调用。__init__(self)被称为构造函数,在实例化类时,一定会调用该方法。可以看到上面的例子中构造函数除了self,还需要一个参数name,因此在实例化该类时必须传入一个参数。

1

2

1

Python的面向对象和Java的面向对象不太一样,学习过Java面向对象编程的pong友,可以对比Python的面向对象编程复习。

继承

Python支持多继承,而Java支持单继承。

Java支持单继承的好处是使得基础关系形成一棵树,继承关系比较清晰,不易产生混乱,不会产生冲突( 如果子类继承的两个父类有相同的方法,那么指类就不知道继承哪个方法了 )。但是当你编写的子类有着两个类的属性和方法时,单继承显得不那么方便了,Java中引入接口来解决这个问题。

Python支持多继承的好处是使得之类能轻松的获取多个父类的属性。但是要注意Python3和Python2的选择继承顺序的规则不一样。除了就近原则(如果父类找到该方法,则不需要继续父类的父类中查找该方法),Python3的是从左到右,广度优先;而Python2则是从左到右深度优先。举例如下

上面的代码在Python3中的输出为C,因为它寻找继承的顺序是[D,B,C,A],但由于C中已找到该方法,故就不需要去A中寻找继承。

上面的代码在Python2中的输出为A,因为它寻找继承的顺序是[D,B,A,C],但由于A中已找到该方法,故就不需要去C中寻找继承。

若想在Python2中有着和Python3一样的继承规则的话,让A继承object类,以表明AA的子类都是新式类。

多态

有了继承之后就可以享受多态的好处,以下是廖雪峰老师给的例子

当你调用run_twice()函数时,随着你传入类的不同,输出结果也会不同,这样使得了程序有着更好的扩展性,当你想增加多一个Animal的之类的时候,你只需实现子类的run方法而不需要修改run_twice函数。即

对扩展开放:允许新增Animal子类;

对修改封闭:不需要修改依赖Animal类型的run_twice()等函数。

封装

与Java的封装相比,Python的封装显得没有那么严格。

Java中封装通过访问修饰符实现并用this关键字来解决变量名与类变量命名冲突问题。例如,如果Java类的一个类变量或类方法的访问修饰符为private,那么类以外的地方都不能引用到该类变量或类方法,换句话说,该变量或方法对外屏蔽,以确保把不必要对外透露的细节封装起来,使得类与类之间的调用更简单而不需要在意实现的细节。

Python类若想对外屏蔽某属性或方法的话,在属性和方法名前加上__(两个下划线),即可实现对外隐藏,但是这种隐藏不是严格的。例如

有类属性__name,不能直接访问__name是因为Python解释器对外把__name变量改成了_类名__name,我们仍可以通过_类名__name访问但我们不应该这么做,既然有意去隐藏该属性,那么我们不应该主动的去破坏封装,而且不同Python的解释器可能会把__name改成不一样的变量名,若执意访问,可能会导致异常的出现。

1

3

1

装饰器

装饰器是Python中一个非常方便的工具,利用装饰器可以增大了代码的重用率。介绍装饰器必须先介绍关于函数的一些概念。

高阶函数:一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

嵌套函数:在一个函数内定义另一个另一个函数,里面的函数叫作内层函数

并且我们还得了解变量的作用域

L (Local) 局部作用域

E (Enclosing) 闭包函数外的函数中

G (Global) 全局作用域

B (Built-in) 内建作用域

变量会以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,全局找不到再去内建作用域中找,直到找到或者找不到(抛出异常)。并且局部变量会屏蔽外部变量。例子如下

变量不只有作用域还有生存周期,一般定义在函数内的变量会随着函数调用的结束而被销毁(形成闭包除外)。

闭包

闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)例子如下

你会发现a在这里其实是表示了当x=3的时候的fun6,所以结果才会为9。

而装饰器的原理其实就是闭包,高阶函数利用闭包,把引用环境与传入的函数组成的闭包当作新函数返回。

但装饰器是有一定“副作用”

类装饰器的实现,以@property为例

Python有几个比较常用的装饰器

@property@property把类方法改成类属性,实现存取器

@classmethod:可以用来定义类方法(不用实例就可以调用)

@staticmethod:主要是方便将外部函数集成到类体中,并且用staticmethod包装的方法可以内部调用,也可以通过类访问或类实例化访问。

资料参考来源:

廖雪峰Python教程

以及网上的各位大佬的博文

本文来自企鹅号 - 全球大搜罗媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文来自企鹅号 - 全球大搜罗媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档