Python私有属性与方法的应用场景及实现机制
本文深入解析Python中私有属性和私有方法的实现机制与应用场景。通过双下划线前缀实现名称改写,Python在保持语言开放性的同时提供了数据封装能力。文章详细探讨了敏感数据保护、接口简化等实际应用场景,并结合代码实例对比了公有、受保护及私有属性的访问差异,帮助开发者理解如何在Python中合理运用封装特性。
Python私有属性与方法概述
类的私有属性和方法
Python作为一种开放型编程语言,其默认机制下所有属性和方法均处于公开状态,这与C++和Java等语言不同,后者拥有明确的public和private关键字来严格区分访问权限。
在Python中,默认的成员函数和变量均为公开访问。所谓类的私有属性,是指那些仅在类内部使用的属性或方法,其语法特征是以双下划线“__”作为属性名或方法名的开头。
class Test(object):
__count = 0 # 私有属性 __count
def get_count(self):
return self.__count # 类的内部可以使用私有属性
def set_count(self, value):
if self.__check_value(value): # 在类的内部调用类的私有方法
self.__class__.__count = value
def __check_value(self, value): # 定义类的私有方法 检查参数
if isinstance(value, int):
return True
a = Test()
print(a.get_count())
a.set_count(100)
print(a.get_count())
#a.__check_value(10) # 调用私有方法会报错
#print(a.__count) # 直接访问私有属性也会报错
私有属性的典型应用场景
应用场景
针对某些敏感数据,若不希望被外部函数直接调用,或防止因疏忽而直接通过 object.key = value的方式修改,可将属性声明为私有。这种机制使得外部无法直接访问该属性,从而避免了意外修改;不过,仍可通过修改属性字典的方式间接更改其值。
# 当然 可以使用 @proprety
class Person(object):
__name = 'Monkey'
def update_name(self, name):
self.__name = name
def get_name(self):
return self.__name
p = Person()
p.update_name('BlackMonkey')
print(p.get_name()) # BlackMonkey
print(p.__name) # 报错 AttributeError: 'Person' object has no attribute '__name'
代码实例与访问机制分析
接下来通过Python代码实例,展示私有属性与受保护属性的具体行为。
具体代码如下所示:
class People:
def __init__(self, name, age):
self.name = name
self.age = age
self._protect_var = 10 # 受保护的成员,使用一个下划线_,它仅仅是提示成员受保护,但可以被更改
self.__private_var = 10 # 使用双下划线__可以定义私有属性
def sayhi(self):
print("Hi, my name is {}, and I'm {}".format(self.name, self.age))
def get_var(self):
print(self.__private_var)
def set_var(self, var):
self.__private_var = var
# class instance 类的实例化
someone = People(name='Jack', age=20) # 类的实例化
print(someone._protect_var) # 10 受保护的成员可以被打印
someone._protect_var = 20 # 受保护的成员可以被修改
print(someone._protect_var) # 20 可以被修改
# print(someone.__private_var) # 报错 AttributeError: 'People' object has no attribute '__private_var'
someone.__private_var = 30 # 此处可以被修改,不会报错(此处表示私有属性可以被修改,具体原因可以百度)
print(someone.__private_var) # 可以打印,不会报错
someone.get_var() # 10 此处可以发现,__private_var在上面被改成30,但此处打印出来却是10(具体原因可以百度)
someone.set_var(40)
someone.get_var() # 40 这里通过someone.set_var(40)改成了40
print(dir(someone)) # dir()打印出someone这个对象支持的属性和方法
# ['_People__private_var', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__private_var', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_protect_var', 'age', 'get_var', 'name', 'sayhi', 'set_var']
# 在类的内部重命名了 __private_var重命名成_People__private_var
someone._People__private_var = 100
someone.get_var() # 100 通过_People__private_var把__private_var的值改成了100
总结
至此,关于Python私有属性和私有方法的应用场景分析已介绍完毕。如需了解更多相关Python私有属性和私有方法内容,建议搜索本站历史文章或继续浏览后续相关文章,感谢大家的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









