面向对象的特征——封装的意义和操作过程

2017-07-27  本文已影响11人  零_WYF

封装

将对象敏感的数据封装在类的内部,不让外界直接访问,而是通过当前类提供的set/get方法间接访问数据,此时就可以在set/get中添加限制条件进行访问数据的控制。

封装实现的步骤:

定义类型,封装零散数据【抽象的属性】

[使用__slots__属性,限制当前类的属性列表 为了代码的统一性]

所有属性私有化【属性使用双下划线开头,外界就不能直接访问这样的属性了】

给每个属性提供set/get方法,在方法中添加限制条件

class Person:

       def __init__(self,name,age):

              self.__name = name

              self.__age = age

       def set_name(self,name):

               self.__name = name

       def get_name(self):

              return self.__name

       def set_age(self,age):

              self.__age = age

       def get_age(self):

              return self.__age

p = Person("问问",11)

print(p.get_name(),p.get_age())

p.set_name("好好")

p.set_age(33)

print(p.get_name(),p.get_age())

高级封装

使用@property和@get_method.setter注解,来注释set/get方法,隐藏set/get方法的实现,让方法的使用方式和属性一致

伪方法重载:python中,默认不提供方法重载,但是在高级封装的过程中,又出现了类似方法重载的代码语法,所以~称之为伪方法重载。

class Person:

       def __init__(self,name,age):

              self.__name = name

              self.__age = age

       @property

       def get_name(self):

                 return self.__name

        @get_name.setter

        def set_name(self,name):

                  self.__name = name

         @property

         def get_age(self):

                  return self.__age

         @get_age.setter

         def set_age(self,age):

                   self.__age = age

         def eat(self):

                   print("吃1234567")

p = Person("问问",11)

print(p.get_name,p.get_age)

p.set_name = "好好"

p.set_age = 33

print(p.get_name,p.get_age)

p.eat()

对方法的封装

在封装的过程中,除了封装私有属性,还可以针对一些底层的操作方法进行私有化,将方法封装在类的内部,通过提供的一个公共方法来控制该方法的访问权限

class MsgManagerment:

          def __sen_vilidata_code(self,code):

          print("发送验证码%s" % code)

          def sen_msg(self,type,code):

                    if type == "1":

                              self.__sen_vilidata_code(code)

                              return 0

                   else:

                              return "没有权限"

m = MsgManagerment()

re = m.sen_msg("2","12345789")

print(re)

上一篇下一篇

猜你喜欢

热点阅读