الأساليب الثابتة والمثيلات في بايثون [نسخة مكررة]
-
28-10-2019 - |
سؤال
هذا السؤال لديه بالفعل إجابة هنا:
هل يمكنني تحديد طريقة بايثون لتكون ثابتة ومثالية في نفس الوقت؟شيء مثل:
class C(object):
@staticmethod
def a(self, arg1):
if self:
blah
blah
حتى أتمكن من تسميته بكلا:
C.a(arg1)
C().a(arg1)
الهدف هو أن تكون قادرًا على تشغيل مجموعتين من المنطق.إذا تم الوصول إليها كطريقة مثيل، فإنها ستستفيد من متغيرات المثيل وتقوم بالأشياء.إذا كان الوصول كطريقة ثابتة، فسيتم الاستغناء عنه.
المحلول
نصائح أخرى
com.formencode لديه classinstancemethod
مصمم الديكور، الذي يفعل ما تريد.يتطلب أن تحتوي الطريقة على وسيطتين (self
و cls
, ، يمكن أن يمر واحد منهم None
اعتمادًا على سياق الاتصال)
مرفوع من formencode/declarative.py
class classinstancemethod(object):
"""
Acts like a class method when called from a class, like an
instance method when called by an instance. The method should
take two arguments, 'self' and 'cls'; one of these will be None
depending on how the method was called.
"""
def __init__(self, func):
self.func = func
def __get__(self, obj, type=None):
return _methodwrapper(self.func, obj=obj, type=type)
class _methodwrapper(object):
def __init__(self, func, obj, type):
self.func = func
self.obj = obj
self.type = type
def __call__(self, *args, **kw):
assert not kw.has_key('self') and not kw.has_key('cls'), (
"You cannot use 'self' or 'cls' arguments to a "
"classinstancemethod")
return self.func(*((self.obj, self.type) + args), **kw)
def __repr__(self):
if self.obj is None:
return ('<bound class method %s.%s>'
% (self.type.__name__, self.func.func_name))
else:
return ('<bound method %s.%s of %r>'
% (self.type.__name__, self.func.func_name, self.obj))
استخدام العينة
class A(object):
data = 5
@classinstancemethod
def print_(self=None, cls=None):
ctx = self or cls
print ctx.data
>>> A.print_()
5
>>> a = A()
>>> a.data = 4
>>> a.print_()
4
لا.ماذا سوف self
يعني داخل الطريقة، إذا كنت تستطيع أن تفعل ذلك؟
سيعمل الرمز الخاص بك إذا قمت بإزالة ملف self
المعلمة ل a()
.عندما تسميها مع C().a(arg1)
يتم تجاهل المثيل.
لكنك تريد أن تعمل هذه الطريقة كطريقة ثابتة وطريقة تتلقى مثيلًا.لا يمكن استخدام الطريقتين.