2018-10-22 Python32 私有化

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 私有化)