Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中:如何使用描述符模拟属性_Python - Fatal编程技术网

python中:如何使用描述符模拟属性

python中:如何使用描述符模拟属性,python,Python,最近,我正在读《学习python》,在这本书中,它使用描述符来模拟属性,如下所示: class Property: def __init__(self, fget=None, fset=None, fdel=None, doc=None): self.fget = fget self.fset = fset self.fdel = fdel # Save unbound methods self.__doc__ = doc # or oth

最近,我正在读《学习python》,在这本书中,它使用描述符来模拟属性,如下所示:

class Property:
    def __init__(self, fget=None, fset=None, fdel=None, doc=None):
      self.fget = fget
      self.fset = fset
      self.fdel = fdel # Save unbound methods
      self.__doc__ = doc # or other callables
    def __get__(self, instance, instancetype=None):
      if instance is None:
         return self
      if self.fget is None:
         raise AttributeError("can't get attribute")
      return self.fget(instance) # Pass instance to self
    def __set__(self, instance, value):
      if self.fset is None:
         raise AttributeError("can't set attribute")
      self.fset(instance, value)
    def __delete__(self, instance):
      if self.fdel is None:
          raise AttributeError("can't delete attribute")
      self.fdel(instance)
最后,它说“…我们必须用setter和deleter方法扩展我们的属性类,这将保存修饰的访问器函数并返回属性对象(self应该足够了)。由于内置属性已经这样做了,我们将在这里省略此扩展的正式编码。”
我的问题是如何实现“setter”decorator和“deleter”decorator?我不知道如何向
属性添加方法

class Property:
    ...
    def setter(self, f):
        self.fset = f
        return self

    def deleter(self, f):
        self.fdel = f
        return self
它们只需使用函数并更改
属性
的相应属性。这些可以用作eg

class some_thing(object):
    @Property
    def some_property(self):
        ...

    @some_property.setter
    def set_some_property(self, x):
        ...

    @some_property.deleter
    def del_some_property(self):
        ...

在这里发布之前,可能先尝试一下。