• 封装及propery的使用


    封装

    封装的目的

      使类中的属性或者方法只允许在类内部使用,不允许外部对其访问,保证数据的安全性。

    封装的方法

      使属性或者函数名改写成:“__属性名或者函数名”的格式,即完成了对本类属性或函数名的隐藏。这样,属性或者函数名的真正名称变形为"_类名__属性名或者函数名"。

    需注意的地方:

      Python实际上不允许在外部使用“_类名_属性名或者函数名”的格式调用该属性或者方法,正确的调用方法是在类中定义一个调取函数,在外部使用该函数完成对封装属性或者方法的调用。

      一个关于封装调用的经典例子:

      

    #在定义阶段就会变形
    class A:
        def __fa(self): #_A__fa
            print('from A')
        def test(self):
            self.__fa() #self._A__fa()
    
    
    class B(A):
        def __fa(self): #_B__fa
            print('from B')
    
    
    b=B()
    b.test() #b._A__fa()
    

    propery的使用

    目的:

      使类中的无参函数成为类中的一个属性,节省代码编写。

    格式:

      

    class  A:
        @property#加装饰器的函数必须是无参函数
        def foo(self):
            print("AAAAA")
    a = A()
    a.foo#为foo方法加了propery装饰器,在调用该装饰器下面的方法时,不需要加括号。propery.setter的使用

    propery.setter的使用

    目的:

      在默认情况下,propery装饰器下的方法不能带有形参,但现实生活中却需要对该装饰器下面的方法中的属性值进行修改,需要重新赋值操作。

    格式:

      @被propery装饰器装饰的方法名.setter

    示例:

    class A:
        def __init__(self, name, sex):
            self.name = name
            self.__sex = sex
    
        @property
        def sex(self):
            return self.__sex
    
        @sex.setter
        def sex(self, value):
            if  not isinstance(value,str):
                raise  TypeError("性别必须是字符串")
            self.__sex = value
    
    
    a = A("老王", "男")
    print(a.sex)
    a.sex = "女"
    print(a.sex)
    

      

    propery.deleter的使用

    目的:

      删除propery装饰器修饰的方法

    示例:

      

    class Foo:
        @property
        def AAA(self):
            print('get的时候运行我啊')
    
        @AAA.setter
        def AAA(self,value):
            print('set的时候运行我啊')
    
        @AAA.deleter
        def AAA(self):
            print('delete的时候运行我啊')
    
    #只有在属性AAA定义property后才能定义AAA.setter,AAA.deleter
    f1=Foo()
    f1.AAA
    f1.AAA='aaa'
    del f1.AAA
    

    注意:

      只有在使用了propery装饰器之后,才能使用“方法名.setter”或者"方法名.deleter",后面的两者均不能脱离propery单独存在。

  • 相关阅读:
    车载以太网 doip someip
    pytest
    lauterbach
    django
    django info
    Linux上加了kdb,softlock
    jenkins war
    Ubuntu 编译安装 Python3.6.8 没有正确编译 sqlite3 的问题
    HTB靶场记录之Bank
    HTB靶场记录之SolidState
  • 原文地址:https://www.cnblogs.com/liuyinzhou/p/7879445.html
Copyright © 2020-2023  润新知