在类中的所有函数上使用操纵属性(python)
我正在寻找解决我遇到的情况的最佳方法。 我有一个python类,它的属性之一是一个字符串,表示文件系统中文件的绝对路径。在类中的所有函数上使用操纵属性(python),python,oop,Python,Oop,我正在寻找解决我遇到的情况的最佳方法。 我有一个python类,它的属性之一是一个字符串,表示文件系统中文件的绝对路径。 在使用属性的所有函数中,我将字符串转换为一个列表,该列表中的每一项都是上述路径中的目录。 显然,我不想每次需要使用列表时都创建它,因为在类中有一个属性(即该列表)更明智。但我不想将这种逻辑放在构造函数中,因为在构造函数中除了赋值之外,任何东西都是不好的做法(测试方面,尽管这种情况并不坏)。 你会怎么处理?如果您不想每次使用此类属性时都重新计算它,您会将其放在类中的什么位置?将
在使用属性的所有函数中,我将字符串转换为一个列表,该列表中的每一项都是上述路径中的目录。
显然,我不想每次需要使用列表时都创建它,因为在类中有一个属性(即该列表)更明智。但我不想将这种逻辑放在构造函数中,因为在构造函数中除了赋值之外,任何东西都是不好的做法(测试方面,尽管这种情况并不坏)。
你会怎么处理?如果您不想每次使用此类属性时都重新计算它,您会将其放在类中的什么位置?将其放在构造函数中。 您的代码不仅可能因可能的数百次列表分配和字符串操作而受到性能方面的影响,而且在函数开始时必然会引入大量代码重复。没有法令规定你应该在每次函数调用中重新计算派生属性 这样写:
class MyClass:
def __init__(self, path):
self.original_path = path
self._split_path = MyClass.split(path) # or whatever the function is called
def my_method(self):
# use self._split_path here.
pass
为什么你认为在构造函数中有字段赋值以外的内容是不好的做法?“在构造函数中有赋值以外的内容是不好的做法”:谁告诉你的?避免副作用和I/O是明智的,但是将数据从一种格式转换到另一种格式也是非常明智的。Alex Reinking我只习惯于除了赋值之外没有任何逻辑的构造函数。也许我错了,但这似乎是我遇到的大多数类的模式。不仅在python中,对于某些类来说,
\uuuu init\uuuu
除了赋值之外什么都不做是有意义的;Python 3.7的dataclass
decorator使定义此类类变得更简单。@Hollevan-最好保证对象在构造后处于定义良好的状态(并且始终保持这种状态)。为此,大多数OOP语言库将对其构造函数参数执行验证,甚至可能抛出异常!我很高兴这就是答案。我学到了一些东西,并获得了一个简单的解决方案!