zoukankan      html  css  js  c++  java
  • 【代码学习】PYTHON 私有化

    一、私有化

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

    class Test(object):
        def __init__(self):
            self.__num = 100
        def setNum(self,newNum):
            self.__num = newNum
        def getNum(self):
            return self.__num
    
    t = Test()
    
    print t.getNum()
    t.setNum(50)
    print t.getNum()

    当__num设置成私有属性后,Test方法无法直接调用,可定义另一个函数间接调用

    以上代码运行结果

    >>> 
    100
    50
    >>> 

    二、属性property

    相当于把方法进行了封装, 开发者在对属性设置数据的时候更方便

    取值的时候自己调用值

    class Test(object):
        def __init__(self):
            self.__num = 100
        def setNum(self,newNum):
            self.__num = newNum
        def getNum(self):
            return self.__num
        num = property(getNum,setNum)
    t = Test()
    
    #注意点:
    #t.num 到底是调用getNum()还是setNum(),要根据实际的场景来判断,
    
    t.num = 200     #相当于调用了 t.setNum(200)
    print t.num     #相当于调用了 t.getNum() 

    另一种使用方法

    class Test(object):
        def __init__(self):
            self.__num = 100
        @property
        def num(self):
            print("----getter----")
            return self.__num
        @num.setter
        def num(self,newNum):
            print("----setter----")
            self.__num = newNum
    
    
    t = Test()
    
    #注意点:
    #t.num 到底是调用getNum()还是setNum(),要根据实际的场景来判断
    
    t.num = 200     #相当于调用了 t.setNum(200)
    print t.num   #相当于调用了 t.getNum() 
  • 相关阅读:
    CodeForces 7B
    CodeForces 4D
    离散化
    线段树入门
    洛谷 P3951 小凯的疑惑(赛瓦维斯特定理)
    Codeforces 1295D Same GCDs (欧拉函数)
    Codeforces 1295C Obtain The String (二分)
    Codeforces 1295B Infinite Prefixes
    Codeforces 1295A Display The Number(思维)
    Codeforces 1294F Three Paths on a Tree(树的直径,思维)
  • 原文地址:https://www.cnblogs.com/sqyysec/p/7182951.html
Copyright © 2011-2022 走看看