所谓封装就是对外部世界隐藏对象的工作细节
今天老师讲了四个例子,由简入繁,由浅入深详细分析了封装的意义及用法
例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),当我们在运用的时候,就可以根据需要,例如是否只读等进行设置
网友评论