如果我有一个对象,并且在该对象内定义了一个变量,那么哪种方法最适合访问该变量?
方法一
使用吸气功能
class MyClass:
def __init__(self):
self.the_variable = 21 * 2
def get_the_variable(self):
return self.the_variable
if __name__ == "__main__"
a = MyClass()
print(a.get_the_variable())
方法二
使用@property
装饰器
class MyClass:
def __init__(self):
self._the_variable = 21 * 2
@property
def the_variable(self):
return self._the_variable
if __name__ == "__main__"
a = MyClass()
print(a.the_variable)
方法三
只需直接访问
class MyClass:
def __init__(self):
self.the_variable = 21 * 2
if __name__ == "__main__"
a = MyClass()
print(a.the_variable)
这些方法中的任何一个是否比其他方法更具Python性?
答案 0 :(得分:6)
方法3是标准的pythonic启动方式。如果您需要该属性的其他逻辑,过滤或其他某种行为,则可以随时返回并为该属性添加方法,并在以后使用@property装饰器。那就是python的美丽,从简单的可行的东西开始。如果以后需要对属性进行更好的控制,则可以创建属性,而不必更新/更改使用该属性的任何客户端代码。客户端代码将不知道直接访问属性与调用方法之间的区别,因此不必更改。
通过PEP 549
证实了这种意识形态Python的描述符协议指导程序员进行优雅的API设计。如果您的类支持类似数据的成员,并且可能有一天可能需要在更改成员的值时运行代码,则建议您暂时将其声明为类的简单数据成员。如果将来确实需要运行代码,则可以将其更改为“属性”,并且很高兴API不会更改。
答案 1 :(得分:0)
由于它基于程序,因此我认为回答起来并不容易。
class MyClass:
def __init__(self):
self.the_variable = 21 * 2
def get_the_variable(self):
return self.the_variable
但是,如果您想将类属性传递给某个变量,我认为最好使用getter-setter
,因为它更具可读性和可理解性。因为您基本上是在告诉我这个值。例如:
if __name__ == "__main__":
a = MyClass()
modified_variable = a.get_the_variable() * 2
相反,如果您仅使用该类属性,则第三个选项a.the_variable
更好。
if a.get_the_variable() == 42:
# do something
else:
# do something