2017-05-25 64 views
3

我目前正在学习OOP,并且我创建了一个存储字典作为变量的类self.foo。我创建了一个方法bar返回self.fooPython - 返回类变量的最佳做法是什么?

class FooBar: 

    def __init__(self): 
     self.foo = {} 

    def bar(self): 
     return self.foo 


if __name__ == '__main__': 
    FooBar() 

我的问题是这样的。直接调用类变量并使用bar方法产生相同的结果,这是访问self.foo的正确方法,还是没有什么区别?

下面是一些例子:

>>>test = FooBar() 
>>>test.foo['test'] = 'This is a test' 
>>>print(test.foo) 
'{'test': 'This is a test'}' 

>>>test.bar()['test_2'] = 42 
>>>print(test.bar()) 
'{'test': 'This is a test', 'test_2': 42}' 
+1

“这是访问self.foo的正确方法” - 取决于类的用途以及它如何记录。 – khelwood

+6

您可能想了解一下'@ property'装饰器:https://stackoverflow.com/a/17330273/295246 –

回答

2

这两种方法都是正确的,它并没有太大的差别,你选择哪一个。使用bar(self)方法的方法是经典的“getter”方法,通常用于其他OO语言来访问典型的私有成员,但在python中,每个成员默认都是公共的,如果使用getter方法,则不会产生影响bar(self)或者直接调用成员foo。

或者,对于getter方法,如果要以不同名称访问成员foo,还可以使用装饰器@property。但是,如果您不需要对foo成员进行任何操作,然后以另一个名称进行访问并将其返回,则还可以在构造函数中简单地将foo成员的引用添加为self.bar = self.foo,以便您可以访问不同的成员名称。 (我认为创建一个方法或使用属性只是为了以不同的名称访问成员,我会使用对成员的引用,但那是我个人的偏好)。

但是,如果您想要标记成员应该被视为私密,并且应该仅在类中或使用setter方法进行修改,那么通常的做法是使用_(例如_foo)启动成员名称。

+0

+1很好的答案。我想说的一切。我会加1件东西。将getter和setter方法编码给公共成员并不认为是pythonic。如果你想像这样访问你的变量,那么你应该让它们是私人的,就像答案中所描述的那样。 – SH7890

0

你应该总是使用property装饰。

如果你直接从函数返回变量,那么这是错误的,读者可能会认为在被调用的函数中会有一些计算或修改,但事实上,你只是传递变量,所以属性装饰器将给读者更清楚的背景。

class FooBar: 

    def __init__(self): 
     self.foo = {} 
    @property 
    def bar(self): 
     return self.foo 

然后访问它像,

>>>test = FooBar() 
>>>test.foo['test'] = 'This is a test' 
>>>print(test.foo) 
'{'test': 'This is a test'}' 

>>>test.bar['test_2'] = 42 
>>>print(test.bar) 
'{'test': 'This is a test', 'test_2': 42}' 
+1

“您应该_always_使用'property'装饰器”?那有什么意思?在任何情况下,房产总是合适的选择? – khelwood

+0

@khelwood补充说明。 – harshil9968

相关问题