首先来比较一下java中的各种修饰符的访问权限
当前类 | 同包 | 子孙类 | 其它包 | |
---|---|---|---|---|
public | √ | √ | √ | √ |
private | √ | × | × | × |
protected | √ | √ | √ | × |
friendly | √ | √ | × | × |
(1)在python 中可以通过在属性变量名前,加上双下划线定义属性为私有属性
(2)特殊变量命名
a. _xx 以单下划线开头的表示的是protected(受保护的) 类型的变量,即保护类型只能靠允许其本身与子类进行访问。若内部变量表示,如:当使用“from M import” 时,不会将一个下划线开头的对象引入。b.__xx 双下划线的表示的是私有类型的变量。只能允许这个类本身进行访问了,连子类也不可以用于命名一个类属性(类变量),调用时名字被改变(在类 FooBar 内部,__boo 变成 __FooBar__boo,如self.__FooBar__boo)
实例:
单下划线与java中protected的属性一致,即可以访问的有当前类,同包,子孙类
python的同包可以理解为同一文件夹中,即此文件夹中有文件init.py文件
子孙类则是继承父类的类
class A():
_name=‘xiaomo’
__sex=‘male’
def say(self):
print self._name
print self.__sex
def get_gender(self):
return self.__sex
a = A()
print a._name
结果是xiaomo
print a.__sex
结果是AttributeError: A instance has no attribute ‘__sex’,直接调用获取sex属性是禁止的
因为他只允许在classA中调用,想要调用时,必须引用get_gender方法
print a.get_gender()
结果是male
class B(A):
favourite=“football”
def get_interesting(self):
return self.favourite
b=B()
print b._name
结果是xiaomo,protected的属性允许子类使用
常用私有变量获取
print dir(a)