我目前正在学习OOP,我创建了一个将dict存储为变量self.foo
的类。我创建了一个返回bar
的方法self.foo
:
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}'
答案 0 :(得分:2)
两种方式都是正确的,并且您选择的方式并没有多大区别。使用bar(self)
方法的方法是经典的" getter"通常在其他OO语言中使用的方法来访问通常的私有成员,但在python中,默认情况下,如果您使用getter方法bar(self)
或直接调用成员foo,则每个成员都是公共的
或者,对于getter方法,如果要使用其他名称访问成员@property
,也可以使用foo
装饰器。但是,如果您在访问并使用其他名称返回之前不需要对foo
成员执行任何操作,您还可以简单地将foo
成员的引用添加为self.bar = self.foo
您的构造函数,以便您能够以不同的名称访问该成员。 (我认为创建方法或使用属性只是为了以不同的名称访问成员我会使用对成员的引用,但这是我个人的偏好)。
但是,如果要标记该成员应被视为私有,并且应仅在类中或使用setter方法进行修改,则通常的做法是使用_
启动成员名称,例如_foo
。
答案 1 :(得分: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}'