如何声明一个python类函数,该函数将仅由同一类的另一个函数使用?

如何声明一个python类函数,该函数将仅由同一类的另一个函数使用?,python,class,oop,Python,Class,Oop,假设我有以下课程: class A(): def fn1(self): pass def fn2(self): pass 现在我想在fn1和fn2中调用函数fn3。函数fn3应该只有fn1和fn2能够调用它(因为fn3只需要fn1或fn2) 我的方法是 class A(): def fn3(self): pass def fn1(self): fn3() pass def f

假设我有以下课程:

class A():
    def fn1(self):
        pass
    def fn2(self):
        pass
现在我想在
fn1
fn2
中调用函数
fn3
。函数
fn3
应该只有
fn1
fn2
能够调用它(因为
fn3
只需要
fn1
fn2

我的方法是

class A():
    def fn3(self):
        pass
    def fn1(self):
        fn3()
        pass
    def fn2(self):
        fn3()
        pass

这里我看到了
fn3
应该有参数
self
(在我的例子中
fn3
没有使用它)的缺点。另一个缺点是
fn3
可以被类外声明的其他对象调用,这是不必要的。

@jornsharpe是正确的。Python被认为是“成人编程语言”——从某种意义上说,它没有阻止程序员做你不想让他们做的事情的机制。通过添加双下划线
\uuuu methodName
您告诉其他程序员“不要在外部调用它”。但是如果他们愿意,他们会:D

如果你真的想变得迂腐,你可以做一些类似的事情来检查调用方法,以确保它是一个“授权”的调用方法

输出:

This is fn1
This is fn3
NO NO! Bad function 'notfn3'
This is notfn3

但是(IMHO),这是很多代码,还有很多额外的处理,只是为了强迫某人不要做你不想让他们做的事情

在Python中,最接近“private”方法的是用两个下划线声明它。就你而言:

class A():
    def fn1(self):
        pass
    def fn2(self):
        pass
    def __fn3(self):
        pass
\uu fn3
self
部分只是将方法“绑定”到类。您不需要在方法体中使用它

根据fn3的复杂程度,另一种解决方案是创建lambda并将其传递给其他函数:

__fn3 = lambda self: print("New private bound")

class A():
    def fn1(self, myfunc):
        pass
    def fn2(self, myfunc):
        pass

a = A()
a.fn1(__fn3)

如果它不需要self,则将其设置为静态方法。如果不应在类外访问它,请将其称为
\u fn3
-按惯例,带前导下划线的方法是私有的。单下划线的可能重复-双下划线用于名称损坏,以避免冲突。
__fn3 = lambda self: print("New private bound")

class A():
    def fn1(self, myfunc):
        pass
    def fn2(self, myfunc):
        pass

a = A()
a.fn1(__fn3)