面向对象的编程语言都有三个显著的特征。封装, 继承, 多态,所谓封装可以简单的理解为。在设计类时刻意的将属性和方法隐藏在类的内部。 这样在使用此类时。就无法直接以类对象.属性名或者类对象.方法(参数名)调用这些属性或方法。 而只能通过隐藏的类方法间接的操作这些隐藏的属性和方法。
python类中的变量和函数不是公有的就是私有的;区别如下
即便是这样python并没有提供public、private这样的修饰符。为了实现类的封装。采取了如下方法
class Person:
def setNumber(self, a):
if a < 20:
return ValueError("被设置的值必须大于10")
self.__number = a
def getNumber(self):
return self.__number
number = property(getNumber, setNumber)
def __getNumber(self):
print(self.__number)
def getName(self):
return self.__name
def setName(self, b):
if isinstance(b, str):
self.__name = b
name = property(getName, setName)
a = Person()
a.number = 21
print(a.number)
a.name = "小王"
print(a.name)
21
小王
我们不难发现a对象的name和number是被隐藏起来的。但与此同时提供了可操作该属性的方法。而这些方法是公有的。不仅如此当操作不规范时。因为增加了控制逻辑所以会抛出异常。
通过对类进行封装。使用户只能通过暴露出来的方法访问其中的属性。还可以通过一些适当的设计可以避免用户对对象的不合理操作。从而提高了类的可维护性和安全性。
此外类中的私有属性和方法不能在类的外部使用
class Person:
def setNumber(self, a):
if a < 20:
return ValueError("被设置的值必须大于10")
self.__number = a
def getNumber(self):
return self.__number
number = property(getNumber, setNumber)
def __getNumber(self):
print(self.__number)
def getName(self):
return self.__name
def setName(self, b):
if isinstance(b, str):
self.__name = b
name = property(getName, setName)
a = Person()
a.__getNumber()
Traceback (most recent call last):
File "/Users/apple/Documents/重要文件/python3/python21.py", line 25, in
a.__getNumber()
AttributeError: 'Person' object has no attribute '__getNumber'