Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
公共使用的Python私有方法_Python_Python 3.x_Private Members - Fatal编程技术网

公共使用的Python私有方法

公共使用的Python私有方法,python,python-3.x,private-members,Python,Python 3.x,Private Members,我有一个类需要实现meth()方法。 现在,我不希望包的最终用户调用此方法。因此,我必须将此方法设置为私有(即_meth()。我知道它实际上不是私有的,但约定很重要。) 但问题是,我的包中还有另一个类B必须调用该方法_meth()。问题是,我现在得到一个警告方法,说B试图访问一个类的受保护方法。因此,我必须公开该方法,即不使用前导下划线。这与我的意图相矛盾 解决这一困境的最有说服力的方法是什么 我知道我可以在A之外重新实现该方法,但这将导致代码重复,并且,由于meth()使用A的私有属性,将

我有一个类需要实现meth()方法。 现在,我不希望包的最终用户调用此方法。因此,我必须将此方法设置为私有(即_meth()。我知道它实际上不是私有的,但约定很重要。)

但问题是,我的包中还有另一个类B必须调用该方法_meth()。问题是,我现在得到一个警告方法,说B试图访问一个类的受保护方法。因此,我必须公开该方法,即不使用前导下划线。这与我的意图相矛盾

解决这一困境的最有说服力的方法是什么


  • 我知道我可以在A之外重新实现该方法,但这将导致代码重复,并且,由于meth()使用A的私有属性,将导致相同的问题

  • 从单个元类继承不是一个选项,因为这些类有完全不同的用途,这将导致可怕的混乱


pylint/您的编辑器/任何外部工具向您发出警告的事实并不会阻止代码执行。我不知道你的编辑器,但pylint警告(注意:“逐案”的意思是:“不要为这行或块警告我”,而不是“完全禁用此警告”)


您自己的代码在同一个包中访问受保护的属性和方法是完全可以的。“\u protected”命名约定并不意味着“无需通过”,只是“您确定您了解自己在做什么,并且如果您破坏了某些东西,是否愿意承担责任?”。由于您是包的作者/维护者,并且这些都是包内访问,因此您显然有权承担此责任;)

可以创建类A的对象或将其传递给类B吗?也许编辑器中会有警告,但无论如何都可以调用该方法。@DeepSpace我考虑过,但最终用户将能够调用该公共包装器本身。你不能,在你的问题主题中,这一矛盾甚至很明显:“用于公共用途的Python私有方法“@Matthias我当然知道,但我希望我的脚本尽可能接近PEP,并且不显示任何警告。我知道这一点,但我仍然希望解决冲突,以便编辑器的右选项卡显示成功的记号,而不是一个紫色的警告符号。@AntonBohdanov那么你必须找出你的编辑使用的是哪根林特,这样你才能告诉他你知道你在做什么。我仍然想解决这个问题,而不仅仅是禁用warning@AntonBohdanov这实际上不是问题-访问受保护方法的代码位于同一个包中,你知道你在这里做什么,没关系。“
\u protected
”命名约定并不意味着“没有人会通过”,而只是“你确定你明白自己在做什么,并且如果你弄坏了什么东西,你愿意承担责任吗?”。除非你的编辑的短绒完全是脑死的,否则你应该能够仅为这句话而使警告静音。谢谢你的澄清。我认为您应该编辑您的初始答案以反映此评论。那我想这就是我一直在寻找的解决方案。那我就接受这个答案。