美文网首页程序园程序员
一个Java 程序员的python学习之路7- private

一个Java 程序员的python学习之路7- private

作者: 赵阳_c149 | 来源:发表于2019-10-31 16:21 被阅读0次

在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'

运行上面的代码可以看到:

  1. 通过实例变量可以访问public属性name
  2. 但是不能通过实例变量访问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

相关文章

网友评论

    本文标题:一个Java 程序员的python学习之路7- private

    本文链接:https://www.haomeiwen.com/subject/aoetbctx.html