laixintao / problems

❓See issues.
0 stars 0 forks source link

Python 的描述器协议 __set__ 对class无效? #5

Open laixintao opened 6 years ago

laixintao commented 6 years ago

必须实例化之后才能执行?

class class_property(object):

    def __init__(self, getter=None, setter=None):
        if getter is not None and not isinstance(getter, classmethod):
            getter = classmethod(getter)
        if setter is not None and not isinstance(setter, classmethod):
            setter = classmethod(setter)
        self.__get = getter
        self.__set = setter

        info = getter.__get__(object)  # just need the info attrs.
        self.__doc__ = info.__doc__
        self.__name__ = info.__name__
        self.__module__ = info.__module__

    def __get__(self, obj, type=None):
        if obj and type is None:
            type = obj.__class__
        return self.__get.__get__(obj, type)()

    def __set__(self, obj, value):
        if obj is None:
            return self
        return self.__set.__get__(obj)(value)

    def setter(self, setter):
        return self.__class__(self.__get, setter)

class Foo:
    @class_property
    def bar(cls):
        return "shit"

    @bar.setter
    def forbidden_set(cls, value):
        print("set run///")
        raise NotImplementedError

print(Foo.bar)
Foo.bar = "oh no"