首页 > 编程语言 >python的私有属性

python的私有属性

时间:2023-05-22 22:46:24浏览次数:38  
标签:__ kwds python self 私有 init valid kwargs 属性

对于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)

标签:__,kwds,python,self,私有,init,valid,kwargs,属性
From: https://www.cnblogs.com/zero17/p/17421986.html

相关文章

  • centos升级python到3.8
    环境:centos7.9一、卸载自带python3.7#卸载python3rpm-qa|greppython3|xargsrpm-ev--allmatches--nodeps#删除所有残余文件whereispython3|xargsrm-frv#查看现有安装的python,验证是否删除干净whereispython二、安装python3.8前置依赖yuminstallzl......
  • python day08 字典、元组、集合内置方法
    字典的内置方法定义方式d={'usernamne':"kevin"}定义空字典:d={}1.key取值dic={'name':'kevin','age':18,'hobbies':['playgame','basketball']}print(dic['name'])#kevinp......
  • 用Python开发输入法后台(3)——我自己的输入法的规则
    我的输入法基本开发完成了,如下所示:  现在总结一下我的输入规则:1.用户输入几个字符,就代表几个字的词.比如输入'w'表示以w开头的单字词,输入wm,表示拼音首字母开头的双字词,gsm表示拼音首字母开头的3字词; 2.输入分号,表示词的个数已固定,需要进一步筛选;同时......
  • python调用父类方法的三种方式(super调用和父类名调用)
    子类调用父类的方法的三种方式:父类名.方法名(self)super(子类名,self).父类方法名()super().父类方法名注意:super()通过子类调用当前父类的方法,super默认会调用第一个父类的方法(适用于单继承的多层继承如下代码:#自定义师傅类-古法classMaster(object):#方......
  • 用Python将女朋友的照片做成壁纸软件,实现桌面壁纸自动更换!
    话说兄弟们,女朋友生气了都是怎么哄的?不会吧不会吧,不会有人还是单身狗吧!  算了,还是回到正题吧,再说我要挨打了~今天咱们来交流一下程序员是怎么哄女朋友的,话不多说直接开始!准备工作1、环境首先我们准备好环境和编辑器,我使用的是:Python3.8解释器Pycharm编辑器2、......
  • python基础08
    字典的内置方法1#dic={'username':"kevin",'age':18}2#定义空字典3#d={}4#info=dict(username='kevin',age=18)5#print(info)67##1.支持key取值8#new_dic=dic['username']9#print(new_dic)10#ite......
  • python 问题修复ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+
    目录python问题修复ImportError:urllib3v2.0onlysupportsOpenSSL1.1.1+升级openssl版本降低urllib版本python问题修复ImportError:urllib3v2.0onlysupportsOpenSSL1.1.1+这个问题时python版本安装的urllib3版本过高,而openssl版本太低导致的解决无非两种方法,降低......
  • python pip超时解决方案
    目录pythonpip超时解决方案使用-i选项指定pip源使用--default-timeout选项增加超时时间增加重试次数pythonpip超时解决方案当执行pip3install命令时出现超时错误,通常是由于网络连接不稳定或网络速度较慢引起的。为了解决这个问题,你可以尝试以下方法:使用-i选项指定......
  • python 入门
    python入门#!/usr/bin/python#coding=utf-8ifTrue:print"True"else:print"False"print"helloworld"#total=item_one+item_two+item_threedays=['Monday','Tuesday','wednesday�......
  • 利用Python爆破数据库备份文件
    某次测试过程中,发现PHP备份功能代码如下://根据时间生成备份文件名$file_name='D'.date('Ymd').'T'.date('His');$sql_file_name=$file_name.'.sql';那么形成的文件名格式如:D20180118T101433.sql,理论上是可以爆破的,于是写了一段Python脚本来尝试爆破。Py......