类的访问控制
Last updated
Last updated
在 Java 中,有 public (公共)属性 和 private (私有)属性,这可以对属性进行访问控制。
那么在 Python 中有没有属性的访问控制呢?
一般情况下,我们会使用 __private_attrs
两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs
。
为什么只能说一般情况下呢?
因为实际上, Python 中是没有提供私有属性等功能的。
但是 Python 对属性的访问控制是靠程序员自觉的。为什么这么说呢?
看看下面的示例:
仔细看图片,为什么说双下划线不是真正的私有属性呢?我们看下下面的例子,用下面的例子来验证:
输出的结果如下图:
一个类创建的时候,就会包含一些方法,主要有以下方法:
类的专有方法:
__init__
构造函数,在生成对象时调用
__del__
析构函数,释放对象时使用
__repr__
打印,转换
__setitem__
按照索引赋值
__getitem__
按照索引获取值
__len__
获得长度
__cmp__
比较运算
__call__
函数调用
__add__
加运算
__sub__
减运算
__mul__
乘运算
__div__
除运算
__mod__
求余运算
__pow__
乘方
当然有些时候我们需要获取类的相关信息,我们可以使用如下的方法:
type(obj)
:来获取对象的相应类型;
isinstance(obj, type)
:判断对象是否为指定的 type 类型的实例;
hasattr(obj, attr)
:判断对象是否具有指定属性/方法;
getattr(obj, attr[, default])
获取属性/方法的值, 要是没有对应的属性则返回 default 值(前提是设置了 default),否则会抛出 AttributeError 异常;
setattr(obj, attr, value)
:设定该属性/方法的值,类似于 obj.attr=value;
dir(obj)
:可以获取相应对象的所有属性和方法名的列表:
其实我们也可以把方法看成是类的属性的,那么方法的访问控制也是跟属性是一样的,也是没有实质上的私有方法。一切都是靠程序员自觉遵守 Python 的编程规范。
示例如下,具体规则也是跟属性一样的,