18.python面对对象编程(一)—什么是面向对象,类和实例,访问限制

终于开始了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改成不同的变量名。

那我们又想要访问怎么办呢?因为,我们是担心别的程序会误操作修改对象,但是如果我们确实有需要修改对象怎么办?这就涉及到面对对象的特性了。下回再说了。

希望有志同道合的小伙伴关注我的公众平台,欢迎您的批评指正。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值