Python 编写一个

Python 编写一个,python,list,properties,decorator,member,Python,List,Properties,Decorator,Member,在我正在编写的类中,成员属性之一是列表: @property def address_list(self): return self._address_list @address_list.setter def address_list(self, addr_list): if type(addr_list) is not list: return self._address_list = addr_list 我希望能够编写一个属性,这样,如果有人想在

在我正在编写的类中,成员属性之一是列表:

@property
def address_list(self):
    return self._address_list

@address_list.setter
def address_list(self, addr_list):
    if type(addr_list) is not list:
        return
    self._address_list = addr_list
我希望能够编写一个属性,这样,如果有人想在列表中添加某些内容,它将调用另一个setter函数,但要添加到列表中:

Object.address_list.append(value)
我会称之为

@property.appender # I made this line up
def address_list.append(self, value):
    if value >= 0 and value <= 127:
        self._address_list.append(value)
@property.appender#我排好了这个队
def address_list.append(self,value):

如果value>=0且value,则需要创建一个新的AddressList类来处理此问题。差不多

class Wrapper(object):
    """Wrapper class that provides proxy access to an instance of some
       internal instance."""
    __wraps__  = None
    __ignore__ = "class mro new init setattr getattr getattribute"
    def __init__(self, obj):
        if self.__wraps__ is None:
            raise TypeError("base class Wrapper may not be instantiated")
        elif isinstance(obj, self.__wraps__):
            self._obj = obj
        else:
            raise ValueError("wrapped object must be of %s" % self.__wraps__)
    # provide proxy access to regular attributes of wrapped object
    def __getattr__(self, name):
        return getattr(self._obj, name)

    # create proxies for wrapped object's double-underscore attributes
    class __metaclass__(type):
        def __init__(cls, name, bases, dct):
            def make_proxy(name):
                def proxy(self, *args):
                    return getattr(self._obj, name)
                return proxy
            type.__init__(cls, name, bases, dct)
            if cls.__wraps__:
                ignore = set("__%s__" % n for n in cls.__ignore__.split())
                for name in dir(cls.__wraps__):
                    if name.startswith("__"):
                        if name not in ignore and name not in dct:
                            setattr(cls, name, property(make_proxy(name)))




class AddressList(Wrapper):
    __wraps__=list
    def append(self,x):
        if 0 <= x <= 127:
            self._obj.append(x)
        else:
            raise ValueError("Cannot append %r"%x)


class MyContainer:
    def __init__(self):
        self.address_list = AddressList([])


x = MyContainer()
x.address_list.append(1)
x.address_list.append(7)
x.address_list.append(-1)

print x.address_list
类包装器(对象):
“”“包装器类,该类提供对某些
内部实例。”“”
__包装_u=无
__忽略\uu=“class mro new init setattr getattr getattribute”
定义初始(自我,对象):
如果self.___;为无:
raise TypeError(“基类包装可能未实例化”)
elif isinstance(对象、自身):
自身。_obj=obj
其他:
raise VALUERROR(“包装的对象必须是%s”%self.\uu包装的对象)
#提供对包装对象的常规属性的代理访问
def _ugetattr _;(self,name):
返回getattr(self.\u obj,name)
#为包装对象的双下划线属性创建代理
类\元类\类型:
定义初始值(cls、名称、基数、dct):
def make_代理(名称):
def代理(自身,*args):
返回getattr(self.\u obj,name)
返回代理
类型。初始化(cls、名称、基数、dct)
如果cls.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
忽略=设置(“\uuuuu%s\uuuuuu%n代表cls中的n.\uuuuu忽略\uuuuuu0.split())
对于目录中的名称(cls.\uuuu包装):
如果name.startswith(“\”):
如果名称不在忽略中且名称不在dct中:
setattr(cls、名称、属性(生成代理(名称)))
类地址列表(包装器):
__包装=列表
def附加(self,x):

如果0,您可能需要创建一个新的addresslist类,但您不能;任何
object.address\u list
返回的对象都需要支持
append()
方法。address\u list返回一个常规的python
list
ergo无论您给append什么都会被追加。。。为了做你想做的事情,你必须创建一个新的类,以不同的方式处理append