Python 入门:From Zero to Hero(下)

接Python 入门:From Zero to Hero (上),今天发这个教程的后半部分。

主要是面向对象相关的一些内容。

5

类与对象 Classes & Objects

Python 是完全面向对象的编程语言,它也有类 (class) 与对象 (object) 的概念。

关于什么是面向对象,我想大家都已经或多或少的有所了解,这里就不做赘述了。

类 (class) 与对象 (object) 是模型与实例的关系,它们有两方面的特征:属性 (attribute) 与方法 (method)。

Python 中类的定义方法如下:

这里 pass 是一条空语句,仅仅起了占位的作用。

而对象则是类的实例,它的定义方法如下:

这里,car 就是 Vehicle 的一个对象。

下面,我们来完善Vehicle 类。

想象一下,Vehicle 类可能的属性,假设有这四个:轮子数量、油箱类型、座位容量、最大速度。

我们希望,在创建Vehicle 对象的时候,就能设置这些属性,那怎么实现呢?

可以在定义Vehicle 类的时候,定义一个 __init__ 方法,接收自定义的数据为自身属性赋值。

__init__ 是一个构造函数,注意:它前后各有两个下划线,它的第一个参数永远是 self,代表了创建的实例本身。

比如你喜欢特斯拉这种汽车,假设它拥有:4 个轮子、电力发动、5 座、最大速度 250 km/h,那么我们就可以这样来定义特斯拉汽车对象:

好,上面讲到了如何 set 属性,那怎么 get 属性呢?

可以利用方法(method)。

这里,定义了两个方法:get_number_of_wheels() 和 set_number_of_wheels(),它们分别被称为:getter 和 setter。前面一个方法是用来获取属性,后面一个方法用来设置属性。

上面是定义 getter 和 setter 的其中一种方式。

在 Python 中,还有另外一种更为简单的方式来定义getter 和 setter 。

那就是利用 @property 装饰器。

这样就可以像属性一样来使用方法,而不必做函数调用。

当然,类的方法是可以随意定义的,不止 setter 和 getter, 你还可以定义其他别的方法。

当调用 make_noise() 的时候,会打印 VRUUUUUUUM。

6

封装Encapsulation

封装性是对属性以及方法实施访问限制的一种机制,说通俗点就是,对外隐藏了内部的实现细节。

下面我们来看看 public 以及 non-public 实例属性和方法都是如何工作的。

public 实例属性

前面讲过,属性的定义以及初始化是在 __init__ 构造函数里面来完成的。

上面就定义了一个 first_name 属性。

在创建实例对象的时候,我们可以把first_name 初始化为不同的值。

其实有必要纠正并强调一下,严格点说,这里的first_name 并不是类属性,而是实例属性,也叫实例变量。

这里的first_name 就是一个 public 实例属性。

Python 的类属性和实例属性是不一样的!这一点跟其他编程语言不同。

类属性的定义以及用法如下:

这里的 first_name 才是类属性。

对于类的所有实例来说,它被初始化为固定值 「TK」。

回到主题,对于 public实例属性而言,对象可以随意访问、get & set 变量的值。

还是拿 person 类举例子,我们给 first_name 属性赋上一个别的值。

因为 first_name 是 public 的,所以它可以被随意赋值。

non-public 实例属性

根据 Python 官方说明,Python 中并没有真正的 private 属性,所以,本文还是一概用non-public一词。

non-public 实例属性的定义方法是:在变量前面加上一个下划线 _ 或者两个下划线 __。

前面加一个下划线,如 _email。

可以看到,前面加一个下划线的变量在类外是可以访问的。

前面加两个下划线,如 __email。

而两个下划线的变量,在类外是不能被访问的。

_email 与 __email 有点类似于 protected 与 private 的关系。

尽管单下划线的实例属性在类外可以访问,但按照约定俗成,并不鼓励这样去做。对于 non-public 实例属性的访问,最好在类的内部通过方法 (method) 来实现。

public 方法

这里 show_age() 就是一个 public 方法,它可以在类的外面被调用。

non-public 方法

上面 _show_age() 与 __show_age() 都是 non-public 方法,可以看到_show_age() 在类外可以被正常访问,而__show_age() 却不能。

non-public 方法与non-public 实例属性的用法一致。

7

继承 Inheritance

在面向对象的编程中,类是可以继承的,子类从父类中继承通用的属性和方法。

比如,定义一个 Car 类。

再定义一个 ElectricCar 类。

因为ElectricCar 本身也是 Car,所以它可以从 Car 类继承,继承方法如下:

就像这样,非常简单,ElectricCar 作为子类,无需实现 __init__,就自带了该构造函数 ( 继承自 Car 类)。

OK,Python 的密集知识点就这些,一个词:

完美

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180117G0NS7500?refer=cp_1026

扫码关注云+社区