有没有办法禁用 python class 中的某些功能,以便只能在其 class 中使用它才能使用它?
Is there a way to disable some function in python class so that it cannot be used except using it in inside its class?
例如我有 myClassFile.py 文件,代码如下:
class myClass:
def first(self):
return 'tea'
def second(self):
print(f'drink {self.first()}')
然后我有 run.py 文件,代码如下:
from myClassFile import myClass
class_ = myClass()
class_.second()
当我运行会输出
>>> 'drink tea'
如何防止有人在 run.py 文件或 myClass 之外编写以下代码?
class_.first()
因此,如果他们在 myClass class 之外使用该方法,那将是一个错误或某种错误
Python 不支持这些。您可以通过在它们前面加上 _
来将它们标记为私有,或者通过在它们前面加上 __
.
来更难调用它们
这些被称为私有方法。要在 python 中创建私有变量或方法,只需在其前面加上 __
,这样 def second(self)
就会变成 def __second(self)
.
这也适用于变量和函数式编程变量!
class Test:
def test(self):
self.__test()
def __test(self):
print('_test')
x = Test()
x.__test()
报错,但x.test()
打印_test
成功!
请注意,这仍然可以通过使用 x.__Test__test()
运行
您可以通过在方法和属性前加上 __
前缀来为它们添加一定程度的保护。
但是你不能让它们完全私有(据我所知),总有办法解决,如下例所示。
class MyClass:
def __init__(self):
self.__a = 1
def __method(self):
return 2
obj = MyClass()
# obj.__a # raise an exception
# obj.__method() # raise an exception
print(dir(obj)) # you can see the method and attributes have been renamed !
print(obj._MyClass__a) # 1
print(obj._MyClass__method()) # 2
例如我有 myClassFile.py 文件,代码如下:
class myClass:
def first(self):
return 'tea'
def second(self):
print(f'drink {self.first()}')
然后我有 run.py 文件,代码如下:
from myClassFile import myClass
class_ = myClass()
class_.second()
当我运行会输出
>>> 'drink tea'
如何防止有人在 run.py 文件或 myClass 之外编写以下代码?
class_.first()
因此,如果他们在 myClass class 之外使用该方法,那将是一个错误或某种错误
Python 不支持这些。您可以通过在它们前面加上 _
来将它们标记为私有,或者通过在它们前面加上 __
.
这些被称为私有方法。要在 python 中创建私有变量或方法,只需在其前面加上 __
,这样 def second(self)
就会变成 def __second(self)
.
这也适用于变量和函数式编程变量!
class Test:
def test(self):
self.__test()
def __test(self):
print('_test')
x = Test()
x.__test()
报错,但x.test()
打印_test
成功!
请注意,这仍然可以通过使用 x.__Test__test()
您可以通过在方法和属性前加上 __
前缀来为它们添加一定程度的保护。
但是你不能让它们完全私有(据我所知),总有办法解决,如下例所示。
class MyClass:
def __init__(self):
self.__a = 1
def __method(self):
return 2
obj = MyClass()
# obj.__a # raise an exception
# obj.__method() # raise an exception
print(dir(obj)) # you can see the method and attributes have been renamed !
print(obj._MyClass__a) # 1
print(obj._MyClass__method()) # 2