2015-07-15 3 views
2

В классе я пишу, один из свойств элементов является список:Написание способ задания

@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 

Я хочу, чтобы иметь возможность написать свойство, так что если кто-то хотел добавить что-то на список было бы назвать что-то вроде другой функции сеттера, но для добавления на список:

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) 

, чтобы я мог безопасно добавлять значения в свой личный список. Возможно ли подобное, без необходимости создавать новый тип объекта списка?

EDIT: Список адресов она возвращает стандартный Python list

+0

вам, вероятно, потребуется сделать новый класс Addresslist –

+0

Вы не можете; любой возвращаемый объект object.address_list' должен поддерживать метод 'append()'. –

+0

address_list возвращает регулярный python 'list' – Sawyer

ответ

2

вам нужно будет создать новый класс 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 

* обратите внимание, что этот ответ заимствует из https://stackoverflow.com/a/9059858/541038 *

 Смежные вопросы

  • Нет связанных вопросов^_^