从另一个模块调用python中的私有类成员函数

时间:2016-11-28 20:14:35

标签: python class import

是否可以调用另一个类中声明的私有函数?如果是,我需要在主文件中调用一个函数。必须从另一个模块导入此功能。此函数在类中定义如下。

class ConfLoader(object):
.....
    def _set_config_value(self, section, attribute, value):
....

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

Python没有“强制”私有函数,但它确实有一个命名约定,使得意外更难。这通常是通过在下划线前面来完成的(不像在你的例子中那样,单个的,作为普通的方法名称)。例如:

class X(object):
    def __f(self):
        print('hello')

如果我尝试在类定义之外使用相同的名称,它将失败:

>>> x = X()
>>> x.__f()
Traceback (most recent call last):
  File "test.py", line 7, in <module>
    x.__f()
AttributeError: 'X' object has no attribute '__f'

相反,Python使用_ClassName__PrivateMethod。我可以使用以下内容在类定义之外调用此伪私有函数:

>>> x._X__f()
hello

有关更多有用信息,请参阅Why are Python's 'private' methods not actually private?

当然,请注意,仅仅因为某些事情可能并不意味着它是好主意。设计良好的类具有私有函数是有原因的:这些内部函数无意与外部函数安全地交互。

答案 1 :(得分:0)

Python通过修改以两个下划线开头但不以下划线结尾的方法名称来实现伪随机方法。它只是将类名添加到前面。

>>> class Foo(object):
...     def __private(self):
...         print('secret')
... 
>>> dir(Foo)
['_Foo__private', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

注意_Foo__private方法名称。你可以叫这个名字。

>>> Foo()._Foo__private()
secret

遗产变得奇怪。请注意,子类有两个私有方法。子类需要意识到重要性不要惊讶。如果您使用私有方法,您可能会发现任何从该类继承但仍想使用您的代码的人都会陷入困境。

>>> class Bar(Foo):
...     def __private(self):
...         print('secret 2')
... 
>>> dir(Bar)
['_Bar__private', '_Foo__private', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

私有方法不是实现者公共接口的一部分,可以在不违反公共接口的情况下随时更改。您可以使用它们,但请注意所有黑客规则都适用。