PySide Shiboken CPython Qt
++. Qt python, QPushButton,
++, __class__.
>>> button = QPushButton()
>>> button.__class__ = MyButton
TypeError: __class__ assignment: only for heap types
Shiboken, ( )
,
():
import types
def override_text(self):
return 'overridden'
button.text = types.MethodType(override_text, button, QPushButton)
, QPushButton MyButton,
MyButton QPushButton
. MyButton QPushButton
, MyButton
QPushButton.
MyButton QPushButton.
class MyButton(QPushButton):
def text(self):
print("inside MyButton.text()")
return QPushButton.text(self)
- . .
super() TypeError, self QPushButton
MyButton .
, mixin, MyButtonOverrides:
class MyButtonOverrides(object):
def text(self):
print("inside MyButtonOverrides.text()")
return self.__class__.text(self)
- .
QPushButton.text() self.__class__
MyButtonOverrides .
extend_instance(),
MyButton ( MyButtonOverrides) QPushButton
:
import inspect
def extend_instance(obj, cls):
for name, attr in vars(cls).items():
if inspect.isroutine(attr):
setattr(obj, name, attr.__get__(obj, obj.__class__))
,
(, MyButton), :
def extend_instance(obj, cls):
for name, attr in vars(cls).items():
if inspect.isroutine(attr):
if isinstance(attr, classmethod):
setattr(obj, name, attr.__get__(cls, cls))
else:
setattr(obj, name, attr.__get__(obj, obj.__class__))
Python 2.7 3.3,
2.6+ 3+.
, , extend_instance().
>>> button = QPushButton()
>>> extend_instance(button, MyButton)
>>> button.text()
inside MyButton.text()
u''