python封装

2021-01-06 18:28

阅读:631

标签:font   使用   ret   不能   for   ase   enc   getc   操作   

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__)

  技术图片

 

 

 

 

保留方法:

技术图片

 

 

技术图片

 

技术图片

 

技术图片

 

技术图片

 

技术图片

 

python封装

标签:font   使用   ret   不能   for   ase   enc   getc   操作   

原文地址:https://www.cnblogs.com/zhaoxiansheng666/p/12975890.html


评论


亲,登录后才可以留言!