eryksun added the comment:

>            super(type, cls).__setattr__(key, value)

In your case, super(type, cls).__setattr__ references object.__setattr__.

    >>> super(type, MyClass).__setattr__.__objclass__
    <class 'object'>

That's from the method resolution order (__mro__):

    >>> print(*MyMeta.__mro__, sep='\n')
    <class '__main__.MyMeta'>
    <class '__main__.MetaA'>
    <class '__main__.MetaB'>
    <class 'type'>
    <class 'object'>

Instead use super(MyMeta, cls), or in Python 3 just use super() in a method 
(under the hood the function uses a closure variable named __class__).

    >>> super(MyMeta, MyClass).__setattr__.__objclass__
    <class 'type'>

>        type.__setattr__(MyClass, 'test', 42)

The above won't work for a Qt subclass. You need __setattr__ from 
sip.wrappertype.

    >>> type.__setattr__(QtClass, 'test', 42)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: can't apply this __setattr__ to sip.wrappertype object

    >>> print(*QtMeta.__mro__, sep='\n')
    <class '__main__.QtMeta'>
    <class '__main__.MetaA'>
    <class 'sip.wrappertype'>
    <class 'type'>
    <class 'object'>

    >>> super(QtMeta, QtClass).__setattr__.__objclass__
    <class 'sip.wrappertype'>
    >>> super(QtMeta, QtClass).__setattr__('test', 42)
    >>> QtClass.test
    42

----------
nosy: +eryksun

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue23276>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to