我试图理解和使用属性装饰器主要是为了使属性只读。我看到,每次使用属性时,它都会进入属性装饰器。
在我的示例中,它进入装饰器三次,每次打印一次:
class PropTest:
def __init__(self,x):
self._x = x
@property
def x(self):
return self._x
def check(self):
print(self.x + 1)
print(self.x + 2)
print(self.x + 3)
t = PropTest(3)
t.check()
如果我在__init__
中定义属性,它将仅输入一次。
class PropTest:
def __init__(self,x):
self.x = x
def check(self):
print(self.x + 1)
print(self.x + 2)
print(self.x + 3)
t = PropTest(3)
t.check()
我使用装饰器的方式错误吗?使用时是否存在性能问题?
L.E。 :
这是我尝试使用属性装饰器的方法。我不想每次使用该属性时都读取excel,并且我希望数据框为只读。
@property
def rules_df(self):
"""
:return: A dataframe that contains the rules for labels
"""
self._rules_df = pd.read_excel(self.cfg_file)
return self._rules_df
答案 0 :(得分:1)
您在第一个示例中正确使用了该属性。在第二个示例中,您不使用属性,而只是设置对象的成员。
属性只是使方法像字段一样起作用的语法糖。
可能会影响性能。通常不用担心。
如果要设置属性this Q/A on SO的值可能会有所帮助。
答案 1 :(得分:0)
仅显示对象属性没有创建属性的意义。如果需要在此处添加一些逻辑,则可以使用该属性。属性通常在Java,C#等语言中使用,但是在Python等语言中,您可以直接访问属性而无需创建属性。如示例所示,通过属性访问对象属性会对性能产生影响。您的第二个示例是一种更Python化的编码方式。