封装:即在设计类时,刻意的将一些属性和方法隐藏在类的内部,这样将无法直接以"类对象.属性名"(或者"类对象.方法名(参数)")的形式调用这些属性(或方法),而只能用未隐藏的方法间接的操作这些隐藏的属性和方法。
- 封装机制保证了类内部数据结构的完整性,很好的避免了外部对内部数据的影响,提高了程序的可维护性。
- 避免用户对类中属性或方法进行不合理的操作。
- 提供代码的复用性。
python类如何进行封装
不同于其他面向对象的编程语言,python类中的变量和函数不是共有的就是私有的。
- public:公有属性的类变量和类函数,在类的外部、类内部以及子类中,都可以正常访问
- private:私有属性的类变量和类函数,只有在本类内部使用,类的外部以及子类都无法使用。
但是,python并没有提供public、private这些修饰符。为了实现类的封装,python采取了下面的方法:
- 默认情况下,python类中的变量和方法都是公有的,它们的名称前都没有下划线(_)
- 如果类中的变量和函数,其名称以双下划线“__”开头,则该变量或函数为私有的。
- 以单下划线“_”开头的类属性和类方法约定俗成的被视为私有属性和私有方法,虽然它们也能通过类对象正常访问,但是建议不要这样。
- 以双下划线开头和结尾的类方法(如__init__())时python内部定义的,自己定义时,不要使用这种格式。
class Person:
def setname(self, name):
if len(name) < 3:
raise ValueError('名称长度必须大于3!')
self.__name = name
def getname(self):
return self.__name
#为name配置setter和getter方法
name = property(getname, setname)
def setage(self, age):
if age < 100:
self.__age = age
else:
raise ValueError('年龄必须小于100!')
def getage(self):
return self.__age
#为age配置getter和setter方法
age = property(getage, setage)
#定义私有方法
def __display(self):
print(self.__name, "今年", self.__age, "岁。")
xiaobai = Person()
xiaobai.name = "xiaobai"
xiaobai.age = 20
print(xiaobai.name)
print(xiaobai.age)
xiaobai
20