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__)