So ersetzen Sie die Basisklasse in Python [geschlossen]Python

Python-Programme
Guest
 So ersetzen Sie die Basisklasse in Python [geschlossen]

Post by Guest »

Hier ist der Code:

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)
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.

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
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.

Code: Select all

from pymysql.cursors import DictCursorMixin

# note that Cursor is the new I defined above
class DictCursor(DictCursorMixin, Cursor):
pass
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.

Code: Select all

# the old class
class SSCursor(RawCurors):
# here has many methods
pass

class SSDictCursor(DictCursorMixin, SSCursor):
pass
Und wenn es eine Möglichkeit gibt, die Basis von SSCursor durch Cursor zu ersetzen, ohne eine neue Klasse zu definieren?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post