So ersetzen Sie die Basisklasse in Python [geschlossen]
Posted: 13 Jan 2025, 09:39
Hier ist der Code:
So ändern Sie die Basisklasse, ohne doppelten Code zu kopieren.
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.
Jetzt funktioniert es gut, wenn ich den Parameter „cursorclass=Cursor“ von pymysql.Connection setze. Irgendwann muss ich DictCursor verwenden. Es ist sehr beispielhaft im Quellcode von pymysql definiert. Ich kann immer noch kopieren, um es zu implementieren.
Aber es ist nicht einfach, SSDictCursor zu definieren. Es basiert auf SSCursor und DictCursorMixin und SSCursor verfügt über viele Methoden. SSCursor basiert auf Cursor.
Ich möchte die SSCursor-Basisklasse von RawCurors durch Cursor ersetzen und den neuen SSDictCursor definieren.
Und wenn es eine Möglichkeit gibt, die Basis von SSCursor durch Cursor zu ersetzen, ohne eine neue Klasse zu definieren?
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