Logo

郎哥编程

理解Python面向对象的封装原则

2019-04-19 1073

前面一节内容讲到了抽象与对象,抽象是把同类事物的共同特征抽取出来归纳为类,类的具体实例为对象。例如:把具有汁液多、糖分多、含有挥发性芳香物质、可以生食等特征的事物归纳为水果类,苹果、葡萄、生梨则为水果类的具体实例对象。

在面向对象编程思想中,不仅把汁液多、糖分多、含有挥发性芳香物质、可以生食等的共同特征放到水果类里,同时也把水果的开花、落果、膨大、成熟等共同行为放到水果类里,这样水果类既包含了水果所具备的共同特征,也包含了开花、落果、膨大、成熟等共同行为。

当外部需要访问水果类时,调用水果类对外提供的访问方法来访问其共同特征和行为。例如:水果类提供了get方法来访问其属性(特征),也提供了开花、落果、膨大、成熟等方法来访问其行为。

由上面的内容可以看出,Python封装就是把现实世界同类事物的共同特征和行为抽取出来,放到一个新建的类中,并设置类属性(特征)和行为,同时提供外部访问类属性和行为的方法。

把事物的属性和行为封装在一起,可以对外隐藏内部数据,控制用户对内部数据的修改和访问,封装也消除了面向过程编程中数据与操作分离所带来的种种问题,提高了程序的可复用性和可维护性。

下面以水果类为案例,具体说明如何封装一个类。

#定义水果类
class Fruits:
    #水果类汁液含量属性
    water = "";
    #水果类糖分含量属性
    sugar= "";
    #水果类芳香度属性
    fragrance = "";
    #水果类构造方法(函数)
    def __init__(self, inwater, insugar,infragrance):
        self.water = inwater;
        self.sugar = insugar;
        self.fragrance = infragrance;
   
    def getWater(self):
        return self.water;
    def getSugar(self):
        return self.sugar;
    def getFragrance(self):
        return self.fragrance;
   
    def setWatet(self,inwater):
        self.water = inwater;
    def setSugar(self,insugar):
        self.sugar = insugar;
    def setFragrance(self,infragrance):
        self.fragrance = infragrance;
 
#实例化苹果对象       
apple = Fruits("80%","30%","20%");
#输出苹果对象属性
print("汁液含量:%s" % (apple.getWater()));
print("糖分含量:%s" % (apple.getSugar()));
print("芳香度:%s" % (apple.getFragrance()));

类的第一行代码是类的头部,定义一个类使用关键字class,在关键字class后面是类的名称。从类的第二行代码开始是类的主体部分,主体部分主要是类的属性声明和定义方法语句。

在Fruits类中声明了水果类的汁液含量(water)、糖分含量(sugar)和芳香度(fragrance),这些属性是水果类所具有的共同特点,汁液含量丰富、糖分含量大、有一定程度的芳香气味。Fruits类也提供了获取和设置这些属性的方法,这样,对象能够直接调用类中定义的所有方法,当对象要修改或得到自己属性的时候,就必须要调用已定义好的专用的方法才能实现。起到了隐藏内部数据,控制用户对内部数据修改和访问的作用。

对于面向对象编程而言,需要掌握如下几点:

(1)抽象是把同类事物的共同特征抽取出来归纳为类,类的具体实例为对象。

(2)封装就是把抽取的事物属性和行为打包到一个类中,并隐藏内部数据和方法的实现过程。

(3)编程时要遵循对象调用方法,方法修改属性。

从现实世界中封装一个类,就是根据具体的应用从同类型事物中抽取出共同的属性和方法。例如:封装水果类,将苹果、葡萄、生梨等事物的共同特征抽取出来,即汁液含量、糖份含量、芳香度等,只要是具有这些特征的,一般都归为水果类。


代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论