class omnimethod(object):
def __init__(self, func):
self.func = func
def __get__(self, instance, owner):
return functools.partial(self.func, instance)
class Geocoder(object):
def __init__(self, api_key=None, client_id=None, private_key=None):
# omitted
pass
@omnimethod
def geocode(
self,
address,
sensor='false',
bounds='',
region='',
language='',
components=''):
if self is not None: # <-- here
return GeocoderResult(self.get_data(params=params))
else:
return GeocoderResult(Geocoder.get_data(params=params))
正是在这种情况下
我不明白。“if self not None”代码段是什么意思?它在案件中的地位是什么?该自身是函数参数中的参数。但只有我一个人
omnimethod
看起来是一个装饰器,用于将其应用到的函数作为实例或类方法调用让我们调用原始函数
original
和应用decorator的结果,它将成为类Geocoder
,decorated
的geocode
属性考虑两个调用:
根据descriptor protocol报告:
呼叫(1)将解析为:
decorated.__get__(None, Geocoder)("some address")
,返回部分应用于None
的原始函数:functools.partial(original, None)("some address")
,根据{original(None, "some address")
呼叫(2)将解决以下问题:
decorated.__get__(geocoder, Geocoder)("some address")
(其中geocoder
是Geocoder
的实例)functools.partial(original, geocoder)("some address")
original(geocoder, "some address")
因此,
self
如果作为类方法调用,那么它将在原始函数内None
,因此需要进行检查相关问题 更多 >
编程相关推荐