zoukankan      html  css  js  c++  java
  • python的单下划线和双下划线

    python 类中的单下划线开头的变量表示:该方法为类的私有方法,原则上外部不能访问,但是用._XX是可以访问到的

    双下划线开头则是强制外部不能直接访问的用.__XX是访问不到的,它内部其实是将变量名重新命名为:_类名__变量名,所以可以通过._类名__变量名访问

    #_*_coding:utf-8_*_
    __author__ = 'Linhaifeng'
    
    class People:
        __star='earth111111111111'
        __star1='earth111111111111'
        __star2='earth111111111111'
        __star3='earth111111111111'
        def __init__(self,id,name,age,salary):
            print('----->',self.__star)
            self.id=id
            self.name=name
            self.age=age
            self.salary=salary
    
        def get_id(self):
            print('我是私有方法啊,我找到的id是[%s]' %self.id)
    
        #访问函数
        def get_star(self):
            print(self.__star)
    
    
    
    p1=People('123123123123','alex','18',100000000)
    # print(p1.__star)
    print(People.__dict__)
    # print(p1.__star)
    print(p1._People__star)
    #
    # p1.get_star()
    p1.get_star()

     双下划线开头的attr方法

    # class Foo:
    #     x=1
    #     def __init__(self,y):
    #         self.y=y
    #
    #     def __getattr__(self, item):
    #         print('执行__getattr__')
    #
    # f1=Foo(10)
    # print(f1.y)
    # print(getattr(f1,'y'))   #len(str)--->str.__len__()
    # f1.sssssssssssssssssssssssssssssssssssss
    
    
    # class Foo:
    #     x=1
    #     def __init__(self,y):
    #         self.y=y
    #
    #     def __delattr__(self, item):
    #         print('删除操作__delattr__')
    #
    # f1=Foo(10)
    # del f1.y
    # del f1.x
    
    #
    # class Foo:
    #     x=1
    #     def __init__(self,y):
    #         self.y=y
    #
    #     def __setattr__(self, key, value):
    #         print('__setattr__执行')
    #         # self.key=value
    #         self.__dict__[key]=value
    # f1=Foo(10)
    # print(f1.__dict__)
    # f1.z=2
    # print(f1.__dict__)
    # class Foo:
    #     def __getattr__(self, item):
    #         print('------------->')
    #
    # # print(Foo.__dict__)
    # print(dir(Foo))
    # f1=Foo()
    #
    # print(f1.x)  #只有在属性不存在时,会自动触发__getattr__
    #
    # del f1.x #删除属性时会触发_delattr__
    #
    # f1.y=10
    # f1.x=3  # 设置属性的时候会触发——setattr———
    
    
    
    
    
    
    
    
    class Foo:
        def __init__(self,name):
            self.name=name
        def __getattr__(self, item):
            print('你找的属性【%s】不存在' %item)
        def __setattr__(self, k,v):
            print('执行setattr',k,v)
            if type(v) is str:
                print('开始设置')
                # self.k=v #触发__setattr__
                self.__dict__[k]=v.upper()
            else:
                print('必须是字符串类型')
        def __delattr__(self, item):
            print('不允许删除属性【%s】' %item)
            # print('执行delattr',item)
            # del self.item
            # self.__dict__.pop(item)
    
    f1=Foo('alex')
    # f1.age=18 #触发__setattr__
    # print(f1.__dict__)
    # print(f1.name)
    # print(f1.age)
    # print(f1.gender)
    # print(f1.slary)
    print(f1.__dict__)
    del f1.name
    print(f1.__dict__)
  • 相关阅读:
    vue组件传值
    mui父子页面蒙版
    mui页面传值
    mui跳转页面短暂白屏
    Sql 向数据库中添加一行数据
    redis启动报错 no config file specified, using the default config.
    C# 合并表达式树
    .net从集合中取出下拉框类型值数据
    jquery从数组中取出满足要求的元素
    RabbitMQ Topic交换机代码实现
  • 原文地址:https://www.cnblogs.com/jiawen010/p/10113167.html
Copyright © 2011-2022 走看看