终于开始了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=3
print(wolf.eyes)
输出:
2
3
你可以想一下,我们的一个对象如果这样被外部随意修改的话是很可怕的。因为不知道会有生命意想不到的事情发生。如果我们想保证对象的安全,不被随便修改,该怎么办呢?
我们可以采用_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 <module>
print(wolf.__eyes)
AttributeError: 'Animal' object has no attribute 'eyes'
已经不能访问了。
我们思考一下,既然它提示的错误是这个对象没有eyes这个属性,是不是我们指定类就可以访问了?
说干就干!我们把代码改成如下格式:
wolf=Animal(4,2)
print(wolf._Animal__eyes)
果然成功了!!但是千万不要随便这么干!因为不同的解释器会将__eyes改成不同的变量名。
那我们又想要访问怎么办呢?因为,我们是担心别的程序会误操作修改对象,但是如果我们确实有需要修改对象怎么办?这就涉及到面对对象的特性了。下回再说了。
希望有志同道合的小伙伴关注我的公众平台,欢迎您的批评指正。