"if self is not None" 在方法中是什么意思?
What does "if self is not None" mean in a method?
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 is not None" 代码片段是什么意思?它在案例中的位置是什么?这个self是参数,在函数参数中。但是一个人。
omnimethod
看起来是一个装饰器,用于将其应用到的函数作为实例或 class 方法调用。
让我们调用原始函数original
和应用装饰器的结果,它成为classGeocoder
、decorated
的geocode
属性。
考虑两个调用:
Geocoder.geocode("some address") # 1
geocoder = Geocoder()
geocoder.geocode("some address") # 2
调用 (1) 将解析为:
decorated.__get__(None, Geocoder)("some address")
,其中returns原函数部分应用于None
:
functools.partial(original, None)("some address")
,根据 partial
的实现,等同于:
original(None, "some address")
调用 (2) 将解析为:
decorated.__get__(geocoder, Geocoder)("some address")
(其中 geocoder
是 Geocoder
的一个实例)
functools.partial(original, geocoder)("some address")
original(geocoder, "some address")
因此,如果 self
作为 class 方法被调用,则 self
将在原始函数中 None
,因此需要进行检查。
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 is not None" 代码片段是什么意思?它在案例中的位置是什么?这个self是参数,在函数参数中。但是一个人。
omnimethod
看起来是一个装饰器,用于将其应用到的函数作为实例或 class 方法调用。
让我们调用原始函数original
和应用装饰器的结果,它成为classGeocoder
、decorated
的geocode
属性。
考虑两个调用:
Geocoder.geocode("some address") # 1
geocoder = Geocoder()
geocoder.geocode("some address") # 2
调用 (1) 将解析为:
decorated.__get__(None, Geocoder)("some address")
,其中returns原函数部分应用于None
:functools.partial(original, None)("some address")
,根据partial
的实现,等同于:original(None, "some address")
调用 (2) 将解析为:
decorated.__get__(geocoder, Geocoder)("some address")
(其中geocoder
是Geocoder
的一个实例)functools.partial(original, geocoder)("some address")
original(geocoder, "some address")
因此,如果 self
作为 class 方法被调用,则 self
将在原始函数中 None
,因此需要进行检查。