python的私有属性

对于python来说,其并没有像C#、Java那样使用关键字的形式对变量进行访问控制
而是使用 左至少两个下划线,右至多一个下划线的形式(__kwargs)表明一个变量是私有变量

第一种场景,没有使用私有变量,结果与预期有出入,结果输出 b 3
而在我们的预期中,子类传入两个kwargs,子类的init函数对kwargs分组,再调用父类的init函数,实际应该将两个kwargs都输出,但实际只输出了b 3
这是因为子类的valid_kws和父类的vaild_kws都是同一个对象("b"),子类的left_kwargs实际是{'a': 2},再调用父类的init函数时,valid_kws = ["b"],而kwargs是{'a': 2}

class ParentClass:
    valid_kwds = ["a"]

    def __init__(self, **kwargs):
        for k, v in kwargs.items():
            if k in self.valid_kwds:
                print(k, v)


class ChildClass(ParentClass):
    valid_kwds = ["b"]

    def __init__(self, **kwargs):
        left_kwargs = {}
        for k, v in kwargs.items():
            if k in self.valid_kwds:
                print(k, v)
            else:
                left_kwargs[k] = v
        super().__init__(**left_kwargs)


if __name__ == '__main__':
    child = ChildClass(a=2, b=3)

第二种场景,将valid_kwds私有化,结果符合预期


class ParentClass:
    __valid_kwds = ["a"]

    def __init__(self, **kwargs):
        for k, v in kwargs.items():
            if k in self.__valid_kwds:
                print(k, v)


class ChildClass(ParentClass):
    __valid_kwds = ["b"]

    def __init__(self, **kwargs):
        left_kwargs = {}
        for k, v in kwargs.items():
            if k in self.__valid_kwds:
                print(k, v)
            else:
                left_kwargs[k] = v
        super().__init__(**left_kwargs)


if __name__ == '__main__':
    child = ChildClass(a=2, b=3)

posted on 2023-05-22 22:38  Zero0017  阅读(5)  评论(0编辑  收藏  举报