擅长:python、mysql、java
<p>TL;博士,你必须知道</p>
<p>名义上,paren需要调用函数,而不仅仅是返回一个对象</p>
<pre><code>foo.bar # get the bar object
foo.bar() # call the bar object
</code></pre>
<p>可调用对象有一个<code>__call__</code>方法。当python看到()时,它知道调用<code>__call__</code>。这是在C级完成的</p>
<p>此外,python还有属性的概念。它是一个看起来像常规数据对象的可调用数据对象</p>
<pre><code>class Foo:
def __init__(self):
self._foo = "foo"
@property
def foo(self):
return "I am " + self._foo
@foo.setter
def foo(self, val):
assert isinstance(val, str)
self._foo = val + " you bet"
f = Foo()
f.foo = "Hello" # calls setter
print(f.foo) # calls getter
</code></pre>
<p>类似地,当python看到数组表示法<code>foo[1]</code>时,它将调用对象的<code>__getitem__</code>或<code>__setitem__</code>方法,并且对象可以自由地以它认为合适的任何方式重载该调用</p>
<p>最后,对象本身可以使用<code>__getattr__</code>、<code>__getattribute__</code>和<code>__setattr__</code>方法拦截属性访问,让一切都悬而未决。事实上,python并不真正知道获取和设置属性意味着什么。它正在调用这些方法。大多数对象只使用从<code>object</code>继承的默认版本。如果这个类是用C实现的,那么在后台发生的事情就没有尽头了</p>
<p>Python是一种动态语言,许多软件包都添加了抽象,以便于(?)使用其服务。不利的一面是,你可能会花更多的时间在帮助文本和文档上</p>