终于开始了python的核心内容了,前面都是细枝末节的小东西。先开始第一个话题,什么是面向对象的编程(opp)。
1)什么是面向对象
我们可以拿C语言这个典型的面向过程的编程语言来对比,面对同样一个问题,”我吃饭“(原谅我是个吃货)。面向过程关注的是吃这个动作。而面向对象关注的是我或饭这两个对象,而吃只是其中的一个方法。为什么这里用的是“或”呢?因为对象只能关注一个,不能三心二意。要不就关注”我“,要不就关注“饭”。因而,面向对象抽象度更高,因为他包含了两类事物,一类是数据,一类是动作。
2)类和对象
对于面向对象编程来说,我们固然关注对象,但是对象太多了。自然界中的任意一样东西都是对象。我们把各种对象中的某一属性剥离出来,让他们成为一类或者说是一个大的集合。这就叫做类(class),也是一种抽象的数据类型。比如说:动物(animal)。动物是个抽象的概念,我们在其中定义一个具体的动物,狼(wolf)。这就是实例(instance)。定义一个类的标准格式如下:
class Animal(object): def __init__(self,legs,eyes): self.legs=legs self.eyes=eyes
Animal是类名,一般首字母大写。后面括号表示的是这个类从哪个类继承下来的。下一行的__init__(是两个下划线)表示的是这是一个特殊的变量,就是特殊的方法。这个方法是把对象(实例)的属性绑定到这个对象(实例)上面。self是一个形式参数,表示的是这个对象(实例)本身。后面的两个是对这个类的预设属性。下面的两句,则是将该对象的属性绑定到对象上面。然后是指定一个实例。
wolf=Animal(4,2)print(wolf.eyes)
这里对wolf赋给属性。
3)访问限制
我们曾经讲过,函数和变量的作用域。很明显,我们刚刚定义的类,是public的,很容易被修改。示例如下:
wolf=Animal(4,2)print(wolf.eyes)wolf.eyes=3print(wolf.eyes)
输出:
23
你可以想一下,我们的一个对象如果这样被外部随意修改的话是很可怕的。因为不知道会有生命意想不到的事情发生。如果我们想保证对象的安全,不被随便修改,该怎么办呢?
我们可以采用_XXX类型数据来定义属性。示例如下:
#!/usr/bin/env python3# -*- coding: utf-8 -*-class Animal(object): def __init__(self,legs,eyes):#这三个都是形参 self.__legs=legs self.__eyes=eyes
我们尝试从外面访问:
wolf=Animal(4,2)print(wolf.__eyes)
输出:
Traceback (most recent call last): File "C:/Users/Administrator/PycharmProjects/exercise/exercise.py", line 8, in print(wolf.__eyes)AttributeError: 'Animal' object has no attribute 'eyes'
已经不能访问了。
我们思考一下,既然它提示的错误是这个对象没有eyes这个属性,是不是我们指定类就可以访问了?
说干就干!我们把代码改成如下格式:
wolf=Animal(4,2)print(wolf._Animal__eyes)
果然成功了!!但是千万不要随便这么干!因为不同的解释器会将__eyes改成不同的变量名。
那我们又想要访问怎么办呢?因为,我们是担心别的程序会误操作修改对象,但是如果我们确实有需要修改对象怎么办?这就涉及到面对对象的特性了。下回再说了。
领取专属 10元无门槛券
私享最新 技术干货