سؤال

هذا السؤال لديه بالفعل إجابة هنا:

هل يمكنني تحديد طريقة بايثون لتكون ثابتة ومثالية في نفس الوقت؟شيء مثل:

class C(object):
    @staticmethod
    def a(self, arg1):
        if self:
            blah
        blah

حتى أتمكن من تسميته بكلا:

C.a(arg1)
C().a(arg1)

الهدف هو أن تكون قادرًا على تشغيل مجموعتين من المنطق.إذا تم الوصول إليها كطريقة مثيل، فإنها ستستفيد من متغيرات المثيل وتقوم بالأشياء.إذا كان الوصول كطريقة ثابتة، فسيتم الاستغناء عنه.

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

المحلول

Genacodicetagpre

نصائح أخرى

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) يتم تجاهل المثيل.

لكنك تريد أن تعمل هذه الطريقة كطريقة ثابتة وطريقة تتلقى مثيلًا.لا يمكن استخدام الطريقتين.

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