接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 的密集知识点就这些,一个词:
完美
领取专属 10元无门槛券
私享最新 技术干货