浅谈Python对象数据的读写权限
1. Python的访问控制
在Python中,类的成员变量默认是public类型,但是Python提供了一些装饰器,可以使得我们对成员变量进行访问控制,包括private和protected类型。
- private类型(双下划线开头):只能在类内部访问,对象和子类都不能直接访问。
- protected类型(单下划线开头):只能在类内部、对象和其子类中访问。
例如:
class Person:
def __init__(self, name, age):
self._name = name
self.__age = age
p = Person('Alice', 20)
print(p._name) # protected变量,可以访问
print(p.__age) # private变量,无法访问
输出结果:
Alice
Traceback (most recent call last):
File "main.py", line 7, in <module>
print(p.__age) # private变量,无法访问
AttributeError: 'Person' object has no attribute '__age'
2. 对象的属性读写权限
Python中的对象拥有__dict__属性,可以查看对象的所有属性,包括方法和成员变量,但是我们无法直接访问这些private或protected类型的变量。
对象数据的读权限
首先,我们来看如何获取对象的成员变量值。
我们可以通过对象的属性方法,如getattr()
和__dict__
来获取public、protected或private类型的成员变量值。
示例:
class Person:
def __init__(self, name, age):
self._name = name
self.__age = age
p = Person('Alice', 20)
# 使用__dict__获取对象的所有成员变量
print(p.__dict__)
# 使用getattr()获取成员变量的值
name = getattr(p, '_name')
age = getattr(p, '_Person__age') # private数据需要指定方法名
print(name, age)
输出结果:
{'_name': 'Alice', '_Person__age': 20}
Alice 20
对象数据的写权限
其次,我们来看如何修改对象的成员变量值。
- 对public类型成员变量的修改:我们可以直接通过对象的属性方法修改public类型的成员变量值。
- 对protected和private类型成员变量的修改:我们可以定义成员变量的setter方法。这些方法可以被外部访问,可以接受传入的参数,并且可以对私有和保护数据进行修改。
示例:
class Person:
def __init__(self, name, age):
self._name = name
self.__age = age
# 修改私有变量age的setter方法
def set_age(self, age):
self.__age = age
p = Person('Alice', 20)
# 直接修改public类型的成员变量
p._name = 'Bob'
print(p._name)
# 通过setter方法修改protected或private类型的成员变量
p.set_age(25)
print(p._Person__age) # private数据需要指定方法名
输出结果:
Bob
25
结论
通过上述示例,我们可以发现Python是一门难以完全封装的语言,但是我们可以通过各种手段,对代码的功能进行访问控制,从而保证代码的封装性和安全性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈python对象数据的读写权限 - Python技术站