<p>您可以从<a href="http://www.linuxtopia.org/online_books/programming_books/python_programming/python_ch25.html" rel="noreferrer">here</a>中阅读更多关于这两者的信息。但这是同一本书中的一个简单例子,它试图解释解决本质上是同一个问题的不同之处。如您所见,使用属性的实现要简单得多。</p>
<p>有几种方法可以利用Python的内部机制来获取和设置属性值。最易访问的技术是使用property函数定义与属性名关联的get、set和delete方法。property函数为您构建描述符。一种稍微不易访问,但更具可扩展性和可重用性的技术是自己定义描述符类。这允许你有相当大的灵活性。通过创建一个定义get、set和delete方法的类,并将描述符类与一个属性名相关联,就可以做到这一点。</p>
<p>property函数为我们提供了一种简便的方法来实现一个简单的描述符,而无需定义单独的类。而不是创建一个完整的类定义,
我们可以编写getter和setter方法函数,然后将这些函数绑定到属性名。</p>
<p>描述符示例:</p>
<pre><code>class Celsius( object ):
def __init__( self, value=0.0 ):
self.value= float(value)
def __get__( self, instance, owner ):
return self.value
def __set__( self, instance, value ):
self.value= float(value)
class Farenheit( object ):
def __get__( self, instance, owner ):
return instance.celsius * 9 / 5 + 32
def __set__( self, instance, value ):
instance.celsius= (float(value)-32) * 5 / 9
class Temperature( object ):
celsius= Celsius()
farenheit= Farenheit()
>>>
oven= Temperature()
>>>
oven.farenheit= 450
>>>
oven.celsius
232.22222222222223
>>>
oven.celsius= 175
>>>
oven.farenheit
347.0
</code></pre>
<p>属性示例:</p>
<pre><code>class Temperature( object ):
def fget( self ):
return self.celsius * 9 / 5 + 32
def fset( self, value ):
self.celsius= (float(value)-32) * 5 / 9
farenheit= property( fget, fset )
def cset( self, value ):
self.cTemp= float(value)
def cget( self ):
return self.cTemp
celsius= property( cget, cset, doc="Celsius temperature" )
>>>
oven= Temperature()
>>>
oven.farenheit= 450
>>>
oven.celsius
232.22222222222223
>>>
oven.celsius= 175
>>>
oven.farenheit
347.0
</code></pre>