Code: Select all
class A: pass
class B: pass
class Example(A, B): pass
...a lot of method
# new class B called BPlus
class BPlus: pass
# want a new class Example that base on (A, BPlus) but not copy old Example's method.
class Example(A, BPlus)
...here do not copy method
# try change __base__ but got 'readonly attribute' error
Example.__bases__ = (A, BPlus)
Warum ich das möchte?Ich verwende pymysql und muss jede Operation abfangen, um einige Informationen aufzuzeichnen. Ich definiere eine Klasse basierend auf pymysql.cursors.Cursor und überschreibe die Methode __getattribute__ in der Klasse, um die Methodeexecute abzufangen.
Code: Select all
from pymysql.cursors import Cursors as RawCurors
class Cursor(RawCursor):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def __getattribute__(self, item):
"""Here I intercept `execute` method OK""
pass
Code: Select all
from pymysql.cursors import DictCursorMixin
# note that Cursor is the new I defined above
class DictCursor(DictCursorMixin, Cursor):
pass
Ich möchte die SSCursor-Basisklasse von RawCurors durch Cursor ersetzen und den neuen SSDictCursor definieren.
Code: Select all
# the old class
class SSCursor(RawCurors):
# here has many methods
pass
class SSDictCursor(DictCursorMixin, SSCursor):
pass