美文网首页
2018-10-22 Python32 私有化

2018-10-22 Python32 私有化

作者: 孟媛的笔记 | 来源:发表于2018-10-22 22:13 被阅读0次

    dir() #列出所有内置函数或属性

    In [202]: class Test1(object):
       .....:     def __init__(self):
       .....:         self.__tt = 200
       .....:         
    
    In [203]: t = Test1()
    
    In [204]: dir(t)   #列出所有内置函数或属性
    Out[204]: 
    ['_Test1__tt',
     '__class__',
     '__delattr__',
     '__dict__',
     '__dir__',
     '__doc__',
     '__eq__',
     '__format__',
     '__ge__',
     '__getattribute__',
     '__gt__',
     '__hash__',
     '__init__',
     '__le__',
     '__lt__',
     '__module__',
     '__ne__',
     '__new__',
     '__reduce__',
     '__reduce_ex__',
     '__repr__',
     '__setattr__',
     '__sizeof__',
     '__str__',
     '__subclasshook__',
     '__weakref__']
    

     

    xx: 公有变量。
    _x: 单前置下划线,私有化属性或方法,其它模块中用from somemodule import *导入 不能使用,类对象和子类可以访问。
    __xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到)。
    __xx__: 双前后下划线,用户名字空间的魔法对象或属性。例如:__init__, __ 不要自己发明这样的名字。
    xx_: 单后置下划线,用于避免与Python关键词的冲突。

    通过name mangling( 名字重整 (目的就是以防子类意外重写基类的方法或者属性) 如:_Class__name )机制就可以访问private了。

    总结

    • 父类中属性名为__名字的,子类不继承,子类不能访问。
    • 如果在子类中向__名字赋值,那么会在子类中定义的一个与父类相同名字的属性。(用自己的对象引用向__名字赋值也相当于重新定义了一个属性)。
    • _名变量、函数、类在使用from xxx import *时都不会被导入。

     


     

    property

    class Test(object):
        def __init__(self):
            self.__num = 0
    
        def getNum(self):
            print("----getter------")
            return self.__num
    
        def setNum(self, num):
            print("----setter------")
            if isinstance(num, int):
                self.__num = num
            else:
                print("不是整数,不能赋值")
    
        num = property(getNum,setNum)
    
    
    t = Test()
    t.num = "123"
    print(t.num)
    

    结果:

    ----setter------
    不是整数,不能赋值
    ----getter------
    0
    

     


     

    property 的另一种形式

    class Test(object):
        def __init__(self):
            self.__num = 0
        
        @property
        def num(self):
            print("----getter------")
            return self.__num
    
        @num.setter
        def num(self, value):
            print("----setter------")
            if isinstance(value, int):
                self.__num = value
            else:
                print("不是整数,不能赋值")
    
    
    t = Test()
    t.num = "123"
    print(t.num)
    

    结果:

    ----setter------
    不是整数,不能赋值
    ----getter------
    0
    

    相关文章

      网友评论

          本文标题:2018-10-22 Python32 私有化

          本文链接:https://www.haomeiwen.com/subject/yfpnzftx.html