2024-10-01 13:42:27 发布
网友
是否可以调用在另一个类中声明的私有函数?如果是,我需要在主文件中调用一个函数。此函数必须从另一个模块导入。这个函数在类中定义如下。在
class ConfLoader(object): ..... def _set_config_value(self, section, attribute, value): ....
有什么建议吗?在
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方法名。你可以叫这个名字。在
_Foo__private
遗传让事情变得很奇怪。注意下面的子类有两个私有方法。子类需要注意咀嚼,不要惊讶。如果使用私有方法,则可能会发现从类继承并仍希望使用代码的任何人都陷入困境。在
>>> 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,它将失败:
相反,Python使用_ClassName__PrivateMethod。我可以使用以下命令在类定义之外调用这个伪私有函数:
_ClassName__PrivateMethod
>>> x._X__f() hello
有关更多有用的信息,请参见Why are Python's 'private' methods not actually private?。在
当然,请注意,仅仅因为某件事是可能的并不意味着这是一个好主意。一个设计良好的类具有私有函数是有原因的:这些函数是内部函数,外部函数不能安全地与它们交互。在
Python通过咀嚼以两个下划线开头但不以下划线结尾的方法名来实现psuedo私有方法。它只是将类名添加到前面。在
注意
^{pr2}$_Foo__private
方法名。你可以叫这个名字。在遗传让事情变得很奇怪。注意下面的子类有两个私有方法。子类需要注意咀嚼,不要惊讶。如果使用私有方法,则可能会发现从类继承并仍希望使用代码的任何人都陷入困境。在
私有方法不是实现者的公共接口的一部分,可以在不违反公共接口的情况下随时更改。你可以使用它们,但要知道所有的黑客规则都适用。在
Python没有“强制”的私有函数,但是它有一个命名约定,使得意外地更难实现。这通常是通过在一个双下划线前加上一个下划线来完成的(不像在您的示例中那样,一个单独的下划线起着普通方法名的作用)。例如:
如果我试图在类定义之外使用相同的名称this,它将失败:
^{pr2}$相反,Python使用
_ClassName__PrivateMethod
。我可以使用以下命令在类定义之外调用这个伪私有函数:有关更多有用的信息,请参见Why are Python's 'private' methods not actually private?。在
当然,请注意,仅仅因为某件事是可能的并不意味着这是一个好主意。一个设计良好的类具有私有函数是有原因的:这些函数是内部函数,外部函数不能安全地与它们交互。在
相关问题 更多 >
编程相关推荐