浅谈Python对象数据的读写权限
在Python中,对象数据的读写权限是通过访问控制来实现的。对象的属性有三种访问控制,即公开属性、受保护属性和私有属性。这些属性的读写权限是有所不同的。
公开属性
公开属性是指对象的属性没有访问控制。任何人都可以读写这些属性。Python中默认所有属性都是公开属性。如果要创建公开属性,只需要在对象内部定义即可。
示例1:定义一个包含公开属性的类
class Person:
def __init__(self, name, age):
self.name = name # 公开属性
self.age = age # 公开属性
p = Person("Tom", 18)
print(p.name) # 输出:"Tom"
p.age = 20 # 修改年龄
print(p.age) # 输出:20
受保护属性
受保护属性是指对象的属性只能被当前类及其子类访问,外部代码不能访问。在Python中,受保护属性用“_”开头表示。
示例2:定义一个包含受保护属性的类
class Person:
def __init__(self, name, age):
self._name = name # 受保护属性
self._age = age # 受保护属性
class Student(Person):
def __init__(self, name, age, grade):
super().__init__(name, age) # 调用父类构造函数初始化受保护属性
self.grade = grade # 公开属性
s = Student("Tom", 18, "Grade One")
print(s.grade) # 输出:"Grade One"
print(s._name) # 可以访问受保护属性,但不推荐
s._age = 20 # 修改年龄,但不推荐
需要注意的是,虽然受保护属性可以通过“_”开头表示,但这并不意味着不能被访问。事实上,Python并没有严格意义上的访问控制,对于属性的访问权限仅在一定程度上起到了约束作用。
私有属性
私有属性是指对象的属性只能被当前类访问,子类和外部代码都不能访问。在Python中,私有属性用“__”开头表示。
示例3:定义一个包含私有属性的类
class Person:
def __init__(self, name, age):
self.__name = name # 私有属性
self.__age = age # 私有属性
class Student(Person):
def __init__(self, name, age, grade):
super().__init__(name, age) # 调用父类构造函数初始化私有属性
self.grade = grade # 公开属性
s = Student("Tom", 18, "Grade One")
print(s.grade) # 输出:"Grade One"
print(s.__name) # 报错:“'Student' object has no attribute '__name'”
需要注意的是,Python中的私有属性仅仅是一种名称重整的技巧。在类定义时,Python会自动将属性名“__name”重命名为“_Person__name”,这样就实现了对私有属性的访问限制。然而,如果我们真的想要访问私有属性,仍然可以通过“_类名__属性名”的方式访问到这些属性。
总结
Python采用的访问控制方法是一种约定俗成的做法,它并不能像Java、C++等语言一样严格限制数据的访问。在设计类的时候,需要根据具体的情况合理地使用公开属性、受保护属性和私有属性,以实现合适的数据访问控制。