<p>将默认值传递给<code>__init__</code>方法,该方法将保存该值,以便在<code>instance.__dict__[self.name]</code>尚不存在时使用</p>
<pre><code>class NonNegative():
<b>def __init__(self, v=0): # You may or may not want a default default value
self.dflt = v</b>
def __set_name__(self, owner, name):
self.name = name
def __get__(self, instance, owner):
if instance is None:
return self
return instance.__dict__<b>.get(self.name, self.dflt)</b>
def __set__(self, instance, value):
instance.__dict__[self.name] = value</code></pre>
<pre><code>class Person:
fingerCount = NonNegative(10)
eyesCount = NonNegative(2)
def __init__(self, name):
self.name = name
</code></pre>
<p>如果愿意,可以将<code>NonNegative</code>子类化,以提供特定于用例的默认值</p>
<pre><code>class FingerCount(NonNegative):
def __init__(self, v=10):
super().__init__(v)
class EyeCount(NonNegative):
def __init__(self, v=2):
super().__init__(v)
class Person:
fingerCount = FingerCount()
eyecount = EyeCount()
class Cyclops(Person):
eyecount = EyeCount(1)
</code></pre>
<p>如果需要属性的每个实例起始值,请像任何其他属性一样,通过<code>__init__</code>中的setter初始化该属性</p>
<pre><code>class Person:
fingerCount = NonNegative()
eyesCount = NonNegative()
def __init__(self, fcount=10, ecount=2):
self.fingerCount = fcount
self.eyesCount = ecount
</code></pre>