在python类的语境下,private意味着属性和方法只对class的成员可访问,对类外部是不可访问的。
private 属性
假设以下类有private属性,_alias:
# p.py
class P:
def __init__(self, name, alias):
self.name = name # public
self.__alias = alias # private
def who(self):
print('name : ', self.name)
print('alias : ', self.__alias)
创建class P的一个实例,然后看看在外部是否可以访问pulic和private变量:
>>> from p import P
>>> x = P(name='Alex', alias='amen')
>>> x.name
'Alex'
>>> x.alias
Traceback (most recent call last):
File "", line 1, in
AttributeError: P instance has no attribute 'alias'
>>> x.__alias
Traceback (most recent call last):
File "", line 1, in
AttributeError: P instance has no attribute '__alias'
运行上面的代码可以看到:
- 通过实例变量可以访问public属性
name。 - 但是不能通过实例变量访问private属性
__alias。
如果你执意要访问__alias,在class名之前加上一个下划线就能实现这一目的:
>>> x._P__alias
'amen'
通过调用实例的方法,也可以取得预期的效果:
>>> x.who()
('name : ', 'Alex')
('alias : ', 'amen')
private 方法
仍然用前面的代码,但是加上两个方法foo()和__foo():
# p2.py
class P:
def __init__(self, name, alias):
self.name = name # public
self.__alias = alias # private
def who(self):
print('name : ', self.name)
print('alias : ', self.__alias)
def __foo(self): # private method
print('This is private method')
def foo(self): # public method
print('This is public method')
self.__foo()
直接通过class的实例调用private方法是不行的:
>>> from p2 import P
>>> x = P('Alex', 'amem')
>>> x.__foo()
Traceback (most recent call last):
File "", line 1, in
AttributeError: P instance has no attribute '__foo'
类似private属性,可以通过下划线加类名的方式调用private方法:
>>> x._P__foo()
This is private method
当然,通过public方法调用private方法也是可以的:
>>> x.foo()
This is public emthod
This is private method
翻译自:
https://www.bogotobogo.com/python/python_private_attributes_methods.php







网友评论