python:强制一个类方法只能从另一个类方法中调用?

python:强制一个类方法只能从另一个类方法中调用?,python,Python,我有一个包含两个方法a和B的类。该类将被子类化。是否有一种优雅的方式来强制执行B只从A方法中调用类的对象 让我们限制它,并说A只在一个地方被调用,但子类实现了A,并且可以选择在其中调用B。我想到的一种方法是,用设置一个全局变量来包装A调用,该变量表示可以调用B,B在调用该变量时会检查该变量。但这看起来并不优雅 有什么建议吗?实际的私有方法是一种邪恶。通过添加前导下划线将方法标记为内部。这告诉程序员,除非他们知道自己在做什么,否则不要使用它。虽然我不推荐这种做法,但这里有一种方法可以使用sys来完

我有一个包含两个方法a和B的类。该类将被子类化。是否有一种优雅的方式来强制执行B只从A方法中调用类的对象

让我们限制它,并说A只在一个地方被调用,但子类实现了A,并且可以选择在其中调用B。我想到的一种方法是,用设置一个全局变量来包装A调用,该变量表示可以调用B,B在调用该变量时会检查该变量。但这看起来并不优雅


有什么建议吗?

实际的私有方法是一种邪恶。通过添加前导下划线将方法标记为内部。这告诉程序员,除非他们知道自己在做什么,否则不要使用它。

虽然我不推荐这种做法,但这里有一种方法可以使用sys来完成。\u getframe:

输出:

== running tests ==
calling base.A()
  in method A() of a Base instance
calling base.B()
  in method B() of a Base instance
    caller is not A(), aborting
calling derived.A()
  in method A() of a Derived instance
    calling self.B() from A()
  in method B() of a Derived instance
    called from A(), continuing execution...
calling derived.B()
  in method B() of a Derived instance
    caller is not A(), aborting

只需添加一个前导下划线使B私有,这样它就是_B。这告诉人们它是私有方法。我不认为有一种简单甚至可靠的方法可以在Python中实现您想要的功能。从OOP设计的角度来看,它听起来好像您的基类对将从它派生的类知道得太多。在前面加一个下划线表示private,并假设使用tnis对象的人是智能的,然后转到更重要的问题。你能详细说明一下吗?私人方法有什么问题?@Makis:你阻止人们打电话给他们,如果他们需要打电话,你只是无缘无故地让他们生活困难。对于更详细的解释,我有一个答案:为什么其他人能够调用内部函数?C语言中的静态函数也不好吗?@Makis:在现实世界中,当你使用的库不能完全满足你的需要时,调用内部函数的必要性会经常出现。对我来说,这听起来更像是糟糕的设计。我仍然很想知道你是否认为静态是一个完全无用的关键字。但总的来说,我只是觉得你鼓励糟糕的设计,我不必太费劲地思考API,我会把一切公之于众。
== running tests ==
calling base.A()
  in method A() of a Base instance
calling base.B()
  in method B() of a Base instance
    caller is not A(), aborting
calling derived.A()
  in method A() of a Derived instance
    calling self.B() from A()
  in method B() of a Derived instance
    called from A(), continuing execution...
calling derived.B()
  in method B() of a Derived instance
    caller is not A(), aborting