"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和应用装饰器的结果,它成为classGeocoderdecoratedgeocode属性。

考虑两个调用:

Geocoder.geocode("some address")  # 1
geocoder = Geocoder()
geocoder.geocode("some address")  # 2

根据 descriptor protocol:

调用 (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")(其中 geocoderGeocoder 的一个实例)
  • functools.partial(original, geocoder)("some address")
  • original(geocoder, "some address")

因此,如果 self 作为 class 方法被调用,则 self 将在原始函数中 None,因此需要进行检查。