访问可见性
- 私有变量,变量名前面加"__"
- 私有不可继承,不可在外部调用,但可以在内部调用。
- 如果非要使用私有变量,那么可以使用dir(class())去查看它真正的名字。
- 私有变量/函数,在类内部可以直接调用。
- 如果你想体现一个变量/函数特别重要你可以使用"_"
#私有
class A(object):
def __init__(self):
self.__a=1000
self.__b=100
def __B(self):
print(self.__a)
self.c()
def __c(self):
print(self.__a)
A_=A()
print(A_._A__a)
class squre(object):
def __init__(self):
self._mi="藏起来,不给看,想看输密码"
@property
def mi(self):
return self._mi
@mi.setter
def mi(self,str_):
self._mi=str_
def look():
s=squre()
print(s.mi)
def change(password,str_):
if password =='2323213':
s=squre()
s.mi=str_
print(s.mi)
else:
print('密码错误')
change('2323213','hhhhh')
@property装饰器and@.setter装饰器
使用装饰器的时候,需要注意:
- 装饰器名,函数名需要一致.
- property需要先声明,再写setter,顺序不能倒过来
- 如果你希望一点变量只是被访问不能被修改,那么可以使用访问器@property
- 如果要修改访问器中的变量,可以搭建一个修改器,或者删除访问器.
#装饰器的使用
class Name(object):
def __init__(self,a,b):
self.__a=a
self.__b=b
@property
def A (self):
print(self.__a)
name=Name(00,200)
name.A
#修改器的使用
class Name(object):
def __init__(self,a,b):
self.__a=a
self._b=b
@property
def A(self):
print(self.__a)
@A.setter
def A(self,a1):
self.__a=a1
def play(self):
print(self.__a)
print(self.__b)
name=Name(100,200)
name.A=1000
name.play()
- 例子:输入三个数字(私有),求三个数字的和,尝试更改其中两个数字
class A(object):
def __init__(self,a,b,c):
self.__a=a
self.__b=b
self.__c=c
@property
def B(self):
print(self.__a)
@B.setter
def B(self,num):
self.__a=num
def sum(self):
print(self.__a+self.__b+self.__c)
a=A(12,1,4)
a.B=99
a.sum()
在python中类是动态的。
class Num(object):
def __init__(self):
self.a = 1000
def A(self):
print(self.b)
num = Num()
num.b =1000000
# print(num.a)
print(num.b)
num.A()
__slots__魔法
我们讲到这里,不知道大家是否已经意识到,Python是一门动态语言。通常,动态语言允许我们在程序运行时给对象绑定新的属性或方法,当然也可以对已经绑定的属性和方法进行解绑定。但是如果我们需要限定自定义类型的对象只能绑定某些属性,可以通过在类中定义__slots__变量来进行限定。需要注意的是__slots__的限定只对当前类的对象生效,对子类并不起任何作用。
class Person(object):
#限定Person对象只能绑定_name,_age和——gender属性
__slots__ = ('_name','_age','_gender')
def __init__(self,name,age):
self.__name=name
self.__age=age