@staticmethod с @property

Надеюсь, что в вашем случае может работать следующий фрагмент кода: -

if ((len(a) == len(b)) and
   (all(i in a for i in b))):
    print 'True'
else:
    print 'False'

Это гарантирует, что все элементы в обоих списках a & amp; b одинаковы независимо от того, находятся ли они в одном порядке или нет.

Для лучшего понимания см. мой ответ в на этот вопрос

37
задан Konrad Rudolph 20 June 2019 в 09:44
поделиться

3 ответа

Синглтоны бессмысленны в python.

class A:
  class_var = object()

# two objects
a, b = A(), A()

# same var everywhere
assert a.class_var is b.class_var is A.class_var

Python int s отличаются от простых объектов s, так что это не всегда так просто. Но для ваших целей этого кажется достаточно:

class Stats:
    twitter_count = 0

Stats.twitter_count +=1
Stats.twitter_count +=1
assert Stats.twitter_count == 2
2
ответ дан 27 November 2019 в 03:33
поделиться

Я предполагаю предоставление фрагмента кода Python, чтобы показать, как делают , работа свойства и staticmethod была бы полезна.

Они оба - дескрипторы, который реализует __, добираются __ или __ набор __

, свойство является дескриптором данных

class Property(object):
    "Emulate PyProperty_Type() in Objects/descrobject.c"

    def __init__(self, fget=None, fset=None, fdel=None, doc=None):
        self.fget = fget
        self.fset = fset
        self.fdel = fdel
        if doc is None and fget is not None:
            doc = fget.__doc__
        self.__doc__ = doc

    def __get__(self, obj, objtype=None):
        if obj is None:
            return self
        if self.fget is None:
            raise AttributeError("unreadable attribute")
        return self.fget(obj)

    def __set__(self, obj, value):
        if self.fset is None:
            raise AttributeError("can't set attribute")
        self.fset(obj, value)

    def __delete__(self, obj):
        if self.fdel is None:
            raise AttributeError("can't delete attribute")
        self.fdel(obj)

    def getter(self, fget):
        return type(self)(fget, self.fset, self.fdel, self.__doc__)

    def setter(self, fset):
        return type(self)(self.fget, fset, self.fdel, self.__doc__)

    def deleter(self, fdel):
        return type(self)(self.fget, self.fset, fdel, self.__doc__)

И , staticmethod является дескриптором неданных

class StaticMethod(object):
    "Emulate PyStaticMethod_Type() in Objects/funcobject.c"

    def __init__(self, f):
        self.f = f

    def __get__(self, obj, objtype=None):
        return self.f
0
ответ дан 27 November 2019 в 03:33
поделиться

Статические методы не имеют смысла в Python. Это потому, что они не делают ничего такого, чего не могут делать методы класса, и в будущем их будет проще расширить (когда несколько методов класса используют друг друга и т. Д.).

Вам нужно просто свойство метода класса.

У меня здесь есть свойство метода класса из моего кода. Это только для чтения, это все, что мне нужно (так что остальное - упражнение для читателя):

class ClassProperty (property):
    """Subclass property to make classmethod properties possible"""
    def __get__(self, cls, owner):
        return self.fget.__get__(None, owner)()

# how I would use it
class Stats:
    singleton_object = None
    @ClassProperty
    @classmethod
    def singleton(cls):
        if cls.singleton_object is None:
            cls.singleton_object = cls()
        return cls.singleton_object
3
ответ дан 27 November 2019 в 03:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: