كيف يمكنك التحقق من ما إذا كان الثعبان الطريقة هي ملزمة أم لا ؟
-
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)