我是OOP的新手,因此我有一个问题。说我有一个简单的类,有一个公共方法和一个私有方法。如果我在公共方法中调用私有方法 - 它应该返回一个值,还是应该将该值设置为我的对象中的字段,例如:
class Test:
def __init__(self, path):
self.path = path
def __getNoOfFiles(self):
'count files in self.path'
return no_of_files
def readDir(self)
...
no_of_files = __getNoOfFiles()
或
class Test:
def __init__(self, path):
self.path = path
self.no_of_files = 0
def __getNoOfFiles(self):
self.no_of_files = 'count files in self.path'
def readDir(self)
__getNoOfFiles()
no_of_files = self.no_of_files
答案 0 :(得分:2)
IMO的吸气剂和制定者应该是公开的;即,不要在方法的签名之前加上双下划线。同样在Python中,如果要在特定的类实例之外使用它,通常只需访问该值。
关于getter和setter实用程序的讨论应该在你的第一个OOP步骤中帮助你更多;你可以先阅读question。
答案 1 :(得分:1)
你可以这样做。它没有太大的区别......(但是一个重要的区别是,在第二种情况下,你正在为你的实例创建一个额外的实例属性..如果你想要它在其他方法中使用,那么这是合适的)
此外,您无需在公共方法中创建local variable
以使用创建的实例属性。您可以直接访问instance attribute
..
在第二案例中,您无需在公共方法中执行此操作: -
no_of_files = self.no_of_files
你可以直接access your instance attribute
..
你应该在self
实例上调用你的方法..你不能只用它的名字来调用它。
所以,你应该替换: -
__getNoOfFiles()
: -
self.__getNoOfFiles()
而__getNoOfFiles()
并不像__get_no_of_files()
那样具有pythonic - 只是一个建议。
答案 2 :(得分:1)
在大多数情况下,它没什么区别,但选择这种或那种方式的原因很少。如果该值可能不止一次被使用并且计算成本,则将其缓存在类实例中可能会有所帮助。但是类通常包含除了从实例返回值之外什么都不做的方法,因此返回值选项适合该样式。
一般来说,无论你的眼睛看起来更好看。
答案 3 :(得分:0)
这完全取决于你。你需要在no_of_files
之外readDir
吗?如果是的话,可能值得保存它。如果不是......
请注意,在您的示例中,您应该使用no_of_files = self.__getNoOfFiles()
:在方法之前需要self
..