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

2024-10-01 13:42:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

有什么建议吗?在


Tags: 模块文件函数selfconfig声明定义object
2条回答

Python通过咀嚼以两个下划线开头但不以下划线结尾的方法名来实现psuedo私有方法。它只是将类名添加到前面。在

>>> 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方法名。你可以叫这个名字。在

^{pr2}$

遗传让事情变得很奇怪。注意下面的子类有两个私有方法。子类需要注意咀嚼,不要惊讶。如果使用私有方法,则可能会发现从类继承并仍希望使用代码的任何人都陷入困境。在

>>> 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__']

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

Python没有“强制”的私有函数,但是它有一个命名约定,使得意外地更难实现。这通常是通过在一个下划线前加上一个下划线来完成的(不像在您的示例中那样,一个单独的下划线起着普通方法名的作用)。例如:

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

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

^{pr2}$

相反,Python使用_ClassName__PrivateMethod。我可以使用以下命令在类定义之外调用这个伪私有函数:

>>> x._X__f()
hello

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

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

相关问题 更多 >