python封装

Posted zhaoxiansheng666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python封装相关的知识,希望对你有一定的参考价值。

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封装的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段14——Vue的axios网络请求封装

python之路之前没搞明白4面向对象(封装)

回归 | js实用代码片段的封装与总结(持续更新中...)

VsCode 代码片段-提升研发效率

常用Javascript代码片段集锦

常用python日期日志获取内容循环的代码片段