
|W                 @   s   d  Z  Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z e d k r d d	 l Z d d	 l Z e j	 e d
 d d   d	 S)ai  Odd meta class that doesn't subclass type.

This is used for testing support for ExtensionClass in new interfaces.

  >>> class A(object):
  ...     __metaclass__ = MetaClass
  ...     a = 1
  ...
  >>> A.__name__
  'A'
  >>> A.__bases__ == (object,)
  True
  >>> class B(object):
  ...     __metaclass__ = MetaClass
  ...     b = 1
  ...
  >>> class C(A, B): pass
  ...
  >>> C.__name__
  'C'
  >>> int(C.__bases__ == (A, B))
  1
  >>> a = A()
  >>> aa = A()
  >>> a.a
  1
  >>> aa.a
  1
  >>> aa.a = 2
  >>> a.a
  1
  >>> aa.a
  2
  >>> c = C()
  >>> c.a
  1
  >>> c.b
  1
  >>> c.b = 2
  >>> c.b
  2
  >>> C.c = 1
  >>> c.c
  1
  >>> import sys
  >>> if sys.version[0] == '2': # This test only makes sense under Python 2.x
  ...     from types import ClassType
  ...     assert not isinstance(C, (type, ClassType))
  
  >>> int(C.__class__.__class__ is C.__class__)
  1
c               @   s   e  Z d  Z d d   Z d S)MetaMetaClassc             C   s    | d k r |  St  j |  |  S)N	__class__)type__getattribute__)selfname r   :/usr/lib/python3/dist-packages/zope/interface/tests/odd.pyr   G   s    zMetaMetaClass.__getattribute__N)__name__
__module____qualname__r   r   r   r   r   r   E   s   r   c               @   sL   e  Z d  Z d Z e Z d d   Z d d   Z d d   Z d d	   Z	 d
 S)	MetaClasszOdd classes
    c             C   s&   | |  _  | |  _ |  j j |  d  S)N)r	   	__bases____dict__update)r   r   basesdictr   r   r   __init__R   s    		zMetaClass.__init__c             C   s
   t  |   S)N)OddInstance)r   r   r   r   __call__W   s    zMetaClass.__call__c             C   sF   x3 |  j  D]( } t | | |   } | |  k	 r
 | Sq
 Wt |   d  S)N)r   getattrAttributeError)r   r   bvr   r   r   __getattr__Z   s
    zMetaClass.__getattr__c             C   s   d |  j  t t |    f S)Nz<odd class %s at %s>)r	   hexid)r   r   r   r   __repr__a   s    zMetaClass.__repr__N)
r	   r
   r   __doc__r   Z__metaclass__r   r   r   r   r   r   r   r   r   M   s   r   c               @   sL   e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 d
   Z d S)r   c             C   s   | |  j  d <d  S)Nr   )r   )r   clsr   r   r   r   f   s    zOddInstance.__init__c             C   sU   t  j |  d  } | d k r" | S| j | |   } | |  k	 rD | St | d |  S)Nr   r   )objectr   getr   )r   r   r   r   r   r   r   r   i   s    zOddInstance.__getattribute__c             C   s   | |  j  | <d  S)N)r   )r   r   r   r   r   r   __setattr__r   s    zOddInstance.__setattr__c             C   s   |  j  | =d  S)N)r   )r   r   r   r   r   __delattr__u   s    zOddInstance.__delattr__c             C   s    d |  j  j t t |    f S)Nz<odd %s instance at %s>)r   r	   r   r   )r   r   r   r   r   x   s    zOddInstance.__repr__N)r	   r
   r   r   r   r!   r"   r   r   r   r   r   r   d   s
   	r   __main__    NZ	isprivatec              G   s   d S)NFr   )ar   r   r   <lambda>   s    r&   )
r   r   r   r   r   r   r	   Zdoctestr#   Ztestmodr   r   r   r   <module>A   s   