كيف يمكنك التحقق من ما إذا كان الثعبان الطريقة هي ملزمة أم لا ؟

StackOverflow https://stackoverflow.com/questions/53225

  •  09-06-2019
  •  | 
  •  

سؤال

أعطيت إشارة إلى الأسلوب, هل هناك طريقة للتحقق ما إذا كان الأسلوب لا بد أن كائن أو لا ؟ يمكنك أيضا الوصول إلى مثيل أنه لا بد ؟

هل كانت مفيدة؟

المحلول

def isbound(method):
    return method.im_self is not None

def instance(bounded_method):
    return bounded_method.im_self

المعرفة من قبل المستخدم طرق:

عندما المستخدم-تعريف الأسلوب هو كائن إنشاء طريق استرداد معرف من قبل المستخدم وظيفة الكائن من فئة ، im_self السمة None و طريقة كائن هو أن يكون غير منضم.عندما يتم إنشاؤه من قبل استرداد دالة معرفة من قبل المستخدم كائن من الطبقة عبر واحدة من الحالات ، im_self هي السمة سبيل المثال ، طريقة كائن هو أن تكون ملزمة.في كلتا الحالتين, جديد طريقة im_class السمة هي فئة من التي استرجاع يأخذ مكان ، لها im_func السمة الأصلية وظيفة الكائن.

في بيثون 2.6 و 3.0:

على سبيل المثال طريقة كائنات جديدة سمات الكائن وظيفة تضم الأسلوب ؛ جديد مرادف بالنسبة im_self هو __self__, ، im_func يتوفر أيضا __func__.القديمة أسماء لا تزال معتمدة في بايثون 2.6, ولكن ولت في 3.0.

نصائح أخرى

في بيثون 3 __self__ السمة فقط تعيين على الالتزام الأساليب.إنه لم يتم تعيين إلى None على عادي وظائف (أو غير منضم الأساليب التي هي مجرد وظائف في بيثون 3).

استخدام شيء مثل هذا:

def is_bound(m):
    return hasattr(m, '__self__')

اختيار إجابة صحيحة في كل الحالات تقريبا.ولكن عند التحقق من إذا كان الأسلوب لا بد في الديكور باستخدام اختيار الإجابة الاختيار سوف تفشل.النظر في هذا المثال الديكور و طريقة:

def my_decorator(*decorator_args, **decorator_kwargs):
    def decorate(f):
        print(hasattr(f, '__self__'))
        @wraps(f)
        def wrap(*args, **kwargs):
            return f(*args, **kwargs)
        return wrap
    return decorate

class test_class(object):
    @my_decorator()
    def test_method(self, *some_params):
        pass

على print بيان في الديكور طباعة False.في هذه الحالة لا أستطيع أن أجد أي وسيلة أخرى ولكن للتحقق من المعلمات وظيفة باستخدام حجتهم الأسماء والبحث عن واحد اسمه self.وهذا هو أيضا لا ضمان أن تعمل لا تشوبه شائبة لأن الحجة الأولى من طريقة لا يضطر إلى الكشف عن اسمه self و يمكن أن يكون أي اسم آخر.

import inspect

def is_bounded(function):
    params = inspect.signature(function).parameters
    return params.get('self', None) is not None

im_self السمة (فقط بيثون 2)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top