如何声明一个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)