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__)
  • 相关阅读:
    Java 简单算法--打印乘法口诀(只使用一次循环)
    Java简单算法--求100以内素数
    ubuntu 16.04 chrome flash player 过期
    java 网络API访问 web 站点
    java scoket (UDP通信模型)简易聊天室
    leetcode1105 Filling Bookcase Shelves
    leetcode1140 Stone Game II
    leetcode1186 Maximum Subarray Sum with One Deletion
    leetcode31 Next Permutation
    leetcode834 Sum of Distances in Tree
  • 原文地址:https://www.cnblogs.com/jiawen010/p/10113167.html
Copyright © 2011-2022 走看看