封装是面向对象的三大特征之一,就是将对象敏感的数据,也就是对象不想让别人知道的东西给封装在类的内部,封装过后的数据,外界不可以直接访问,如果想要访问可以通过类提供的set/get方法间接访问数据,这样就可以在set/get方法中添加条件限制,这样一来代码的可读性提高的同时,也增强了代码的安全性。
封装的步骤:
1.进行类的定义(将零散的数据封装起来,抽象的属性)
2.使用__slots__魔法属性,限制当前类的属性列表,不让外界随意添加和修改属性。
2.将所有属性通过双下划线私有化,这样外面就不可以直接访问了。
4.给每个属性添加set/get方法,在方法中添加限制条件。
高级封装
使用@property和@get_method.setter注解,来注释set/get方法,隐藏set/get方法的实现,让方法的使用方式和属性一致。
例如:
没有使用@property和get_method.setter的程序
class User:
def__init__(self,name):
self.__name=name#属性私有化
def set_name(self,n): #set方法设置名字
self__name=n
def get_name(self): #get方法获取名字
returnself.__name
u=User("Tom") #创建一个对象
print(u.get_name())
u.set_name("老猫") #使用对象的set方法
print(u.get_name()) #使用get方法获取name
使用@property和get_method.setter方法的程序
class Goods:
def__init__(self,name,price):
self.__name=name
@property
def get_name(self):
returnself.__name
@get_name.setter
def set_name(self,n):
self.__name=n
g=Goods("T恤",120) #创建一个商品对象
print(g.get_name) #获取name
g.set_name="衬衫" #设置name
print(g.get_name) #获取name
从上面可以看出,两种方法虽然没存在什么差别,但是仔细看还是能发现的,有没有发现加了@property的方法可以像属性一样使用,直接赋值和得到,没有了小括号这个东西,这样的好处是隐藏了set/get方法,使方法能像属性一样被使用。 通过@property和@get_method.setter隐藏方法的实现,提高代码的安全性。不过它和访问方法的操作,没有什么区别,仅仅是一种语法糖!仅仅将数据访问方法和普通的方法进行了区分!
伪方法重载:python中,默认不提供方法重载,但是在高级封装的过程中,又出现了类似方法重载的代码语法,所以~称之为伪方法重载。
对方法的封装
在封装的过程中,除了封装私有属性,还可以针对一些底层的操作方法进行私有化,将方法封装在类的内部,通过提供的一个公共方法来控制该方法的访问权限,将方法私有化是在方法名称的前面加上双下化线,这样就将方法给封装起来,可以在其他方法中对它增加条件限制!