浅谈python对象数据的读写权限

  • Post category:Python

浅谈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++等语言一样严格限制数据的访问。在设计类的时候,需要根据具体的情况合理地使用公开属性、受保护属性和私有属性,以实现合适的数据访问控制。