擅长:python、mysql、java
<p>不能同时具有实例变量名<strong>size</strong>和实例方法名<strong>size</strong></p>
<p>如何区分它们</p>
<p>在这里,实例变量优先,因为它是首先定义的(在<code>__init__</code>方法中可能有一个<code>self.size = x</code>,因此首先出现在对象<code>__dict__</code>中),它是<code>int</code>,因此不可调用</p>
<p>如果对<code>size</code>值没有特殊处理,只需直接使用属性而不定义函数:</p>
<pre><code>class Foo:
def __init__(self, somearg):
# ...
self.size = somearg * 3
>>> foo = Foo(3)
>>> foo.size
9
</code></pre>
<p>如果你想让事情变得更复杂(与我这里的小例子相反),使用<a href="https://docs.python.org/3.6/library/functions.html#property" rel="nofollow noreferrer">property</a>:</p>
<pre><code>class Foo:
def __init__(self, somearg):
# ...
self._size = None
self._someattr = somearg
# ...
@property
def size(self):
if self._someattr > 2:
return self._someattr * 3
return 1
>>> foo = Foo(3)
>>> foo.size
9
>>> bar = Foo(2)
>>> bar.size
1
</code></pre>
<p>要完全理解属性装饰器的优点,请阅读<a href="https://www.programiz.com/python-programming/property" rel="nofollow noreferrer">this tutorial</a></p>