Как заменить базовый класс в Python [закрыто]Python

Программы на Python
Ответить
Anonymous
 Как заменить базовый класс в Python [закрыто]

Сообщение Anonymous »

Вот код:

Код: Выделить всё

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)
Как изменить базовый класс без копирования дублирующего кода.

Зачем мне это нужно?Я использую pymysql, и мне нужно перехватывать каждую операцию, чтобы записать некоторую информацию. Я определяю базу класса на pymysql.cursors.Cursor и перезаписываю метод __getattribute__ в классе, чтобы перехватить метод выполнения.

Код: Выделить всё

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
Теперь все работает хорошо, когда я устанавливаю параметр pymysql.Connection курсоркласс = Курсор. Некоторое время мне нужно использовать DictCursor. Это очень похоже на исходный код pymysql. Я все еще могу скопировать и реализовать.

Код: Выделить всё

from pymysql.cursors import DictCursorMixin

# note that Cursor is the new I defined above
class DictCursor(DictCursorMixin, Cursor):
pass
Но определить SSDictCursor непросто. Он основан на SSCursor и DictCursorMixin, а SSCursor имеет множество методов. SSCursor основан на Cursor.
Я хочу заменить базовый класс SSCursor с RawCurors на Cursor и определить новый SSDictCursor.

Код: Выделить всё

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

class SSDictCursor(DictCursorMixin, SSCursor):
pass
А если есть способ заменить базу SSCursor на Cursor без определения нового класса?


Подробнее здесь: https://stackoverflow.com/questions/793 ... -in-python
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»