在python类中,@property是一个很好的装饰器,避免使用显式的setter和getter函数。但是,它的开销是“经典”类函数的2到5倍。就我而言,在设置属性的情况下这是完全可以的,与设置时需要进行的处理相比,开销微不足道。
但是,获取属性时不需要任何处理。它始终只是“返回自我属性”。是否有一种优雅的方法来使用setter而不使用getter而不需要使用其他内部变量?
只是为了说明,下面的类具有属性“ var”,它引用内部变量“ _var”。调用“ var”要比使用“
_var”花费更长的时间,但是如果开发人员和用户都可以只使用“ var”而不必跟踪“ _var”,那就太好了。
class MyClass(object):
def __init__(self):
self._var = None
# the property "var". First the getter, then the setter
@property
def var(self):
return self._var
@var.setter
def var(self, newValue):
self._var = newValue
#... and a lot of other stuff here
# Use "var" a lot! How to avoid the overhead of the getter and not to call self._var!
def useAttribute(self):
for i in xrange(100000):
self.var == 'something'
对于那些感兴趣的人,在我的电脑上,调用“ var”平均需要204 ns,而调用“ _var”平均需要44 ns。
property
在这种情况下,请勿使用。一个property
对象是一个数据描述符,这意味着任何访问instance.var
将调用该描述符和Python将永远不会寻找在实例本身的属性。
您有两种选择:使用.__setattr__()
挂钩或构建仅实现的描述符.__set__
。
.__setattr__()
挂钩class MyClass(object):
var = 'foo'
def __setattr__(self, name, value):
if name == 'var':
print "Setting var!"
# do something with `value` here, like you would in a
# setter.
value = 'Set to ' + value
super(MyClass, self).__setattr__(name, value)
现在,在 读取
.var
时使用普通的属性查找,但是在调用分配给.var
该__setattr__
方法时会使用value
它,让您根据需要进行拦截和调整。
演示:
>>> mc = MyClass()
>>> mc.var
'foo'
>>> mc.var = 'bar'
Setting var!
>>> mc.var
'Set to bar'
setter描述符将仅拦截变量分配:
class SetterProperty(object):
def __init__(self, func, doc=None):
self.func = func
self.__doc__ = doc if doc is not None else func.__doc__
def __set__(self, obj, value):
return self.func(obj, value)
class Foo(object):
@SetterProperty
def var(self, value):
print 'Setting var!'
self.__dict__['var'] = value
请注意我们需要如何分配给instance.__dict__
属性,以防止再次调用setter。
演示:
>>> f = Foo()
>>> f.var = 'spam'
Setting var!
>>> f.var = 'ham'
Setting var!
>>> f.var
'ham'
>>> f.var = 'biggles'
Setting var!
>>> f.var
'biggles'
问题内容: 这是一个纯Python特定的设计问题: 和 Python让我们可以用任何一种方式来做。如果要设计Python程序,将使用哪种方法,为什么? 问题答案: 首选属性。这就是他们在那里的目的。 原因是所有属性在Python中都是公共的。以一两个下划线开头的名称只是警告,给定属性是实现细节,在将来的代码版本中可能会保持不变。它不会阻止您实际获取或设置该属性。因此,标准属性访问是访问属性的常规P
描述 (Description) 它动态构建选择器,并使用属性或变量值作为任意字符串。 例子 (Example) 以下示例演示了在LESS文件中使用转义 - <html> <head> <title>Less Escaping</title> <link rel = "stylesheet" type = "text/css" href = "style.css" /
在使用 @property 之前,让我们先来看一个简单的例子: class Exam(object): def __init__(self, score): self._score = score def get_score(self): return self._score def set_score(self, val):
问题内容: 使用os.system()时,通常必须转义文件名和其他作为参数传递给命令的参数。我怎样才能做到这一点?最好是可以在多个操作系统/外壳上运行的东西,尤其是bash。 我目前正在执行以下操作,但是请确保为此必须有一个库函数,或者至少是一个更优雅/更强大/更有效的选项: 编辑: 我已经接受了使用引号的简单答案,不知道为什么我没有想到;我猜是因为我来自Windows,其中“和”的行为略有不同。
问题内容: MySQL要求对带有阴影的保留字的表进行打勾。我有一个表Role(表角色),它是一个保留字,但是我已经将查询放在后面的刻度中,因此我可以在多行中写它(这是一个玩具查询,大的查询不能放在一行中)。 我如何摆脱背tick? 这是我的代码: 问题答案: 您不能在反引号内转义反引号,但是您可以执行以下操作:
本文向大家介绍Python 类,property属性(简化属性的操作),@property,property()用法示例,包括了Python 类,property属性(简化属性的操作),@property,property()用法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python 类,property属性(简化属性的操作),@property,property()用法。分享给