美文网首页
*Python面向对象--封装

*Python面向对象--封装

作者: 恶人未满 | 来源:发表于2017-07-26 22:01 被阅读0次

    所谓封装就是对外部世界隐藏对象的工作细节

    今天老师讲了四个例子,由简入繁,由浅入深详细分析了封装的意义及用法

    例1:

    >>>classPerson:#定义一个person类

    >>>def__init__(self, name, age):初始化对象的属性

     >>>self.name=name

      >>> self.age=age

    >>>p=Person("tom",12)#声明一个对象

    >>>print(p.name, p.age)#打印

    >>>p.age=13#Python中可对属性操作

    >>>print(p.age)

    第一个例子说明Python的简单封装并不稳定,属性可被更改

    例2:

    >>>classHero:

    >>>def__init__(self, name, age):例2大体和例1 差不多但是不同的是属性封装成__(属性名)

    >>>self.__name=name               这种是把属性定义成私有属性在类外不可任意修改或其他操作

    >>>self.__age=age                    想对私有属性操作需要声明特定的函数

    >>>defget_name(self):#定义get函数,使其能在类外获取属性的值

    >>>returnself.__name

    >>>defset_name(self, name):#定义set函数,使其能在类外修改属性的值

    >>>self.__name=name

    >>>h=Hero("jack",11)

    >>>print(h.get_name())

    >>>h.set_name("fuck")

    >>>print(h.get_name())

    例2主要是对例1 的强化封装,能很好的隐藏对象的属性,不能轻易获取和修改

    例3:

    >>>classMan:

    >>>def__init__(self, name, age):

    >>>self.__name=name#例3是对例2的升华,在原有的基础上增加了@property和

    >>>self.__age=age        @().setter把函数转为对象使用,更好的隐藏了工作细节

    >>>@property                 封装的更加隐秘

    >>>defget_name(self):

    >>>returnself.__name

    >>>@get_name.setter

    >>>defset_name(self, name):

    >>>self.__name=name

    >>>m=Man("lll",18)

    >>>print(m.get_name)

    >>>m.set_name="sdbfdb"

    >>>print(m.get_name)

    本例子不但把属性隐藏了,还隐藏了工作细节,在类外调用时把函数隐藏,封装的更加严密

    例4:

    >>>classWoman:

    >>>def__init__(self, name, age):

    >>>self.__name=name#这是最终版,在例3 的基础上增加了函数的重载这时当我们调用了

    >>>self.__age=age       函数,但是在函数外表现出来的确实对属性的更改,增加了代码的

    >>>@property               保密性

    >>>defname(self):

    >>>returnself.__name

    >>>@name.setter

    >>>defname(self, name):

    >>>self.__name=name

    >>>w=Woman('hello',1)

    >>>print(w.name)

    >>>w.name="wold"

    >>>print(w.name)

    本例子增加了函数的重载,真正意义上隐藏了对象的工作细节,实现了封装,每个类都有自己的构造方法__init__,我对每一个类都进行实例化一个对象;每个对象创建的时候会自动调用自己的__init__方法封装不同的内容

    这里我们把重点放在这个@property这里,在C++或者Java中,我们经常会遇到setter和getter,在这里@property的作用类似,需要注意的是,这里面的同一属性的三个函数要同名(本例中指的是name),当我们在运用的时候,就可以根据需要,例如是否只读等进行设置

    相关文章

      网友评论

          本文标题:*Python面向对象--封装

          本文链接:https://www.haomeiwen.com/subject/cfcwkxtx.html