*Python面向对象--封装

2017-07-26  本文已影响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),当我们在运用的时候,就可以根据需要,例如是否只读等进行设置

上一篇下一篇

猜你喜欢

热点阅读