0

假设我有一个带有一个公共方法和一个私有方法的简单类。如果我在公共方法中调用私有方法 - 它应该返回一个值,还是应该将该值设置为我的对象中的一个字段,例如,

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
4

4 回答 4

2

IMO、getter 和 setter 应该是公开的;即,不要在方法签名之前加上双下划线。同样在 Python 中,如果要在该特定类实例之外使用该值,则通常可以简单地访问该值。

关于 getter 和 setter 实用性的讨论应该会在您的第一个 OOP 步骤中为您提供更多帮助;你可以从阅读这个问题开始。

于 2012-10-01T12:54:26.790 回答
1

在大多数情况下,这几乎没有什么区别,但是选择一种方式或另一种方式有一些次要的原因。如果该值可能被多次使用并且计算成本很高,则将其缓存在类实例中可能会有所帮助。但是类通常包含除了从实例返回值之外什么都不做的方法,因此 return-value 选项适合这种风格。

一般来说,任何看起来更好的东西。

于 2012-10-01T12:58:52.657 回答
1

你可以用任何一种方式来做......它没有太大的区别......(但一个重要的区别是,在第二种情况下,你正在为你的实例创建一个额外的实例属性......如果你想要它用于其他方法,那么这是合适的)。

此外,您无需在公共方法中创建局部变量即可使用创建的实例属性...您可以直接访问该属性instance attribute...

在第二种情况下,您不需要在公共方法中执行此操作:

no_of_files = self.no_of_files

您可以直接访问您的实例属性...

你应该在self实例上调用你的方法......你不能只用它的名字来称呼它......

所以,你应该更换:

__getNoOfFiles()

和:

self.__getNoOfFiles()

__getNoOfFiles()并不像 Pythonic 那样——__get_no_of_files()只是一个建议

于 2012-10-01T12:52:02.537 回答
0

这真的取决于你。如果你需要no_of_files在外面readDir,它可能值得保存。如果不...

请注意,在您的示例中,您应该使用no_of_files = self.__getNoOfFiles(): 您需要self方法之前的。

于 2012-10-01T12:52:22.133 回答