1.面向对象的特征——封装
封装”就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体(即类);封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的访问权限来使用类的成员。
将对象敏感的数据封装在类的内部,不让外界直接访问,而是通过当前类提供的set/get方法间接访问数据,此时就可以在set/get中添加限制条件进行访问数据的控制。
1.类的属性
类由属性和方法组成,类的属性是对数据的封装,而类的方法是对类的行为的封装。
类的属性按使用范围分为共有属性和私有属性。具体地,在Python实现面向对象的编程思想的时候,封装在类中的属性可以分为两种:数据类的属性和数据对象的属性(也可以成为数据类的成员变量和属于对象的成员变量),其中,这两种成员变量又各自分为共有成员变量和私有成员变量。
2.类的成员变量和对象的成员变量
类的成员变量定义在类中,和类的成员函数在同一缩进等级。而对象的成员变量定义在init(self)成员函数中,和init(self)函数下的变量和语句在同一等级。通俗地讲,类的成员变量属于类,共类的所有对象和类本身所共有,也就是说所有的类的对象和类只有一份这样的变量。而对象的成员变量属于类的对象本身,每个对象都有一份,而且各个对象之间互不影响。
3.封装实现的步骤:
定义类型,封装零散数据【抽象的属性】
[使用__slots__属性,限制当前类的属性列表à为了代码的统一性]
所有属性私有化【属性使用双下划綫开头,外界就不能直接访问这样的属性了】
给每个属性提供set/get方法,在方法中添加限制条件
1.class Users(object):
def__init__(self,name):
self.name = name
u = Users("tom")
print(u.name)
u.name ="jerry"
print(u.name)
2.封装私有化,提供set/get函数
class Person(object):
def__init__(self,name):
self.__name = name
def set_name(self,name):
self.__name=name
def get_name(self):
return self.__name
p = Person("shuke")
print(p.get_name())
p.set_name("jerry")
print(p.get_name())
3.高级封装
使用@property和@get_method.setter注解,来注释set/get方法,隐藏set/get方法的实现,让方法的使用方式和属性一致
class Computer(object):
def__init__(self,name):
self.__name = name
@property
def get_name(self):
returnself.__name
@get_name.setter
def set_name(self,name):
self.__name = name
c = Computer("dell")
print(c.get_name)
c.set_name ="hp"
print(c.get_name)
4.实现对方法的封装
在封装的过程中,除了封装私有属性,还可以针对一些底层的操作方法进行私有化,将方法封装在类的内部,通过提供的一个公共方法来控制该方法的访问权限
class Animals(object):
def__init__(self,name,age):
self.__name = name
self.__age = age
@property
def name(self):
return self.__name
@name.setter
def name(self,n):
self.__name = n
@property
def age(self):
returnself.__age
@age.setter
def age(self,a):
if (a >=0)and(a <=20):
self.__age = a
else:
print("年龄输入不合法..")
a =Animals("tiger",10)
a.name ="monkey"
print(a.name)
a.age =22
print(a.age)
封装的作用:一个是保护隐私,一个是降低程序复杂度,提高程序健壮性
网友评论