Skip to content

Latest commit

 

History

History
153 lines (110 loc) · 3.1 KB

narr.rst

File metadata and controls

153 lines (110 loc) · 3.1 KB

zope.proxy Narrative Documentation

Subclassing ProxyBase

If you subclass a proxy, instances of the subclass have access to data defined in the class, including descriptors.

Your subclass instances don't get instance dictionaries, but they can have slots.

>>> from zope.proxy import ProxyBase >>> class MyProxy(ProxyBase): ... __slots__ = 'x', 'y' ... ... def f(self): ... return self.x

>>> l = [1, 2, 3] >>> p = MyProxy(l)

You can use attributes defined by the class, including slots:

>>> p.x = 'x' >>> p.x 'x' >>> p.f() 'x'

You can also use attributes of the proxied object:

>>> p [1, 2, 3] >>> p.pop() 3 >>> p [1, 2]

Using get descriptors in proxy classes

A non-data descriptor in a proxy class doesn't hide an attribute on a proxied object or prevent writing the attribute.

>>> class ReadDescr(object): ... def __get__(self, i, c): ... return 'read'

>>> from zope.proxy import ProxyBase >>> class MyProxy(ProxyBase): ... __slots__ = () ... ... z = ReadDescr() ... q = ReadDescr()

>>> class MyOb: ... q = 1

>>> o = MyOb() >>> p = MyProxy(o) >>> p.q 1

>>> p.z 'read'

>>> p.z = 1 >>> o.z, p.z (1, 1)

Marking proxy attributes as non-overridable

Normally, methods defined in proxies are overridden by methods of proxied objects. This applies to all non-data descriptors. The non_overridable function can be used to convert a non-data descriptor to a data descriptor that disallows writes. This function can be used as a decorator to make functions defined in proxy classes take precedence over functions defined in proxied objects.

>>> from zope.proxy import ProxyBase >>> from zope.proxy import non_overridable >>> class MyProxy(ProxyBase): ... __slots__ = () ... ... @non_overridable ... def foo(self): ... return 'MyProxy foo'

>>> class MyOb: ... def foo(self): ... return 'MyOb foo'

>>> o = MyOb() >>> p = MyProxy(o) >>> p.foo() 'MyProxy foo'

Changing the proxied object

>>> from zope.proxy import ProxyBase >>> from zope.proxy import setProxiedObject, getProxiedObject

>>> class C(object): ... pass

>>> c1 = C() >>> c2 = C()

>>> p = ProxyBase(c1)

setProxiedObject() allows us to change the object a proxy refers to, returning the previous referent:

>>> old = setProxiedObject(p, c2) >>> old is c1 True

>>> getProxiedObject(p) is c2 True

The first argument to setProxiedObject() must be a proxy; other objects cause it to raise an exception:

>>> try: ... setProxiedObject(c1, None) ... except TypeError: ... print("TypeError raised") ... else: ... print("Expected TypeError not raised") TypeError raised