python - Public and private methods in Python
问题描述
I am trying to change a public to private parameter inside a Python class. As far as I know, to make it private I need to declare for instance:
self.__top = None # <-- Instead of self.top = None
However, I cannot figure out how to make a private struct with private properties, such that they are called properly in the public methods.
For instance:
class Stack:
def __init__(self, size=None):
self.__top = None
if size is None: # if size is unset
self.__size = -1
else:
self.__size = size
self.__current_size = -1
def push(self, data):
if self.current_size >= self.size: # ERROR!
print("Stack Overflow!")
return
解决方案
我假设通过使用诸如struct、public和private之类的术语,您必须来自C / C++背景。Python中没有这样的东西,属性的命名纯属约定俗成。
我建议阅读对象名称前的单下划线和双下划线是什么意思?.
通常,对于您不希望其他人在您的班级之外使用的“私有”属性,约定是在其前面加上一个下划线_
,例如_size
. 如果您打算在外面使用它,则归结为以下几种情况:
- 你想让它可以从外面写吗?在这种情况下,您只需将其定义为
size
并在任何地方都像这样使用它 - 你想让它从外部只读吗?在这种情况下,您可以将其设为私有并为其创建一个属性,例如:
代码:
class A:
self __init__(self, size):
self._size = size
@property
def size(self):
return self._size
您还可以将内部变量转换为另一个名称,并使其在该不同名称下同时可写。
例子:
class A:
def __init__(self, value):
self._internal_var = value
def set_data(self, value):
self._internal_var = value
def get_data(self):
return self._internal_var
data = property(get_data, set_data)
或者:
@property
def data(self):
return self._internal_var
@data.setter
def data(self, value):
self._internal_var = value
然后如果你打电话
a1 = A(11)
print(a1.data)
a1.data = 22
print(a1.data)
它将产生:
11
22
推荐阅读
- angular - Angular,@ViewChild 在构造函数/ngOninit 中子组件的值发生变化时不会更新
- mysql - SQL 查询从表 1 中获取 2 个值并连接表 2 中的所有可能选项
- python - Pyspark:如何过滤两列值对的列表?
- javascript - Win32 NodeJS - 从正在运行的窗口中获取图标
- java - 预期为 BEGIN_OBJECT 但为 BEGIN_ARRAY - 为什么会这样?
- list - 用另一个列表 Haskell 中的元素替换元素列表
- multithreading - 具有 MPI_THREAD_MULTIPLE 访问级别的 MPI 中的并发通信
- python - Python 使用套接字连接到外部服务器
- javascript - highcharter 树形图中的单击事件(R 闪亮)
- java - 为一个端点/组而不是整个应用程序指定压缩