1.什么是封装(Encapsulation)?
答:封装是属性和方法的抽象,目的是形成一个类对外可操作属性和方法的接口。
属性的抽象:对类的属性(变量)进行定义,隔离及保护
方法的抽象:对类的方法(函数)进行定义,隔离以及保护。
私有类属性 注意:
class DemoClass:
__count=0 #定义了一个私有类属性__count
def __init__(self,name):
self.name=name
DemoClass.__count+=1 #私有类属性在类的内部使用方法和其他的类属性一致,都是类名.属性名
#如果想要在外部使用这个私有类属性的话,需要再定义一个函数,就是类方法
@classmethod
def getCount(cls):
return DemoClass.__count
dc1=DemoClass("老王")
dc2=DemoClass("老李")
print(DemoClass.getCount()) #私有属性不能使用类名.私有类属性名的方法来直接访问,但是可以使用方法的方式,通过返回值的方式访问
'''
既然都是为了获得私有类属性的值,为什么不把他变成公有的,直接访问呢?
相对于公有属性,如果把一个方法变成私有的,再用一个方法来对他进行访问。所有对这个属性值的访问都需要经过setCount()方法。在这个方法中可以
增加额外的代码,判断访问的有效性。还可以对访问的次数进行计数,可以对访问的这个接口进行很好的控制,可以有效的保护里面的变量
私有属性注意:
class DemoClass:
def __init__(self,name):
self.__name=name #私有实例属性定义
def getName(self):
return self.__name #私有实例属性的内部使用
dc1=DemoClass("老王")
dc2=DemoClass("老李")
print(dc1.getName(),dc2.getName()) #对象方法
print(dc1.__DemoClass__name)#这样也可以访问私有属性,所以说私有属性并不一定真正的私有,只能形式上私有,这也是python和其他语言不通的地方。只是需要再换个名字来访问他
print(dc1.__name,dc2.__name) #会报错
'''
总结:对于类中的属性和实例属性,如果你不希望这个属性可以通过方法或类名.的方式进行访问,你可以把它变成私有的属性
变成私有属性的方法就是在属性名字前面增加双下划线,仅供类内部使用
'''
类的方法:
class DemoClass:
def __init__(self,name):
self.__name=name
def __getName(self): #私有方法的定义
if self.__name!="":
return self.__name
else:
return "老张"
def printName(self):
return "{}同志".format(self.__getName()) #私有方法的使用
dc1=DemoClass("老王")
dc2=DemoClass("")
print(dc1.printName(),dc2.printName()) #封装后通过公开方法使用
'''总结:
各种方法都可任意通过增加双下滑线变为私有方法,私有方法从形式上保护了python类内部使用的函数逻辑,私有与公开是程序员的逻辑,不是安全逻辑,重视约定。'''
class DemoClass:
def __init__(self,name):
self.name=name
def __getName(self): #私有方法的定义
if self.name!="":
return self.name
else:
return "老张"
def printName(self):
return "{}同志".format(self.__getName()) #私有方法的使用
dc1=DemoClass("老王")
dc2=DemoClass("")
print(dc1.printName(),dc2.printName()) #封装后通过公开方法使用
class DemoClass:
"A Demo Class"
def __init__(self,name):
self.name=name
def getName(self):
return self.name
dc1=DemoClass("老王")
print(DemoClass.__qualname__)
print(DemoClass.__name__)
print(DemoClass.__bases__)
class DemoClass:
"A Demo Class"
def __init__(self,name):
self.name=name
def getName(self):
return self.name
dc1=DemoClass("老王")
print("DemoClass.__doc__:",DemoClass.__doc__)
print("DemoClas.__module__:",DemoClass.__module__)
print("DemoClass.__class__:",DemoClass.__class__)
print("dc1.__doc__",dc1.__doc__)
print("dc1.__module__",dc1.__module__)
print("dc1.__class__",dc1.__class__)
print(DemoClass.__dict__)
print()
print(dc1.__dict__)
保留方法:
学习使我快落