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返回一个常规的pythonlist
ergo无论您给append什么都会被追加。。。为了做你想做的事情,你必须创建一个新的类,以不同的方式处理append