[PYTHON] Erstellen Sie eine gefälschte Klasse, die auch betrügt, ist Instanz

Vorwort

Heutzutage ist das Wort Delegierung häufiger als Vererbung. Daher wird häufig eine Klasse erstellt, die ein Objekt für die Delegierung umschließt.

In einem solchen Fall wird der Teil, an dem verzweigt wird, problematisch. (Aus diesem Grund ist Code, der einen Zweig verwendet, der sich nicht duckt, in erster Linie gut Es gibt auch eine Geschichte, die es nicht gibt)

Ist es möglich, den Zweig der Instanz zu betrügen?

Definieren Sie eine Eigenschaft namens class.

Wie kann ich den Zweig seiner Instanz betrügen? Überraschend einfach, Eigenschaft namens "class" Wenn Sie definieren, werden Sie es sehen, wenn Sie mit dieser Instanz auswerten.

Code zur Bestätigung

Versuchen wir das folgende Verhalten. Informationen zu dem Fall, in dem das Benutzerobjekt mit einem Wrapper-Objekt namens LoggedWrapper umbrochen wird. Ich überprüfe, ob ich den Zweig dieser Instanz betrüge.

# -*- coding:utf-8 -*-
import logging
logger = logging.getLogger(__name__)


class LoggedWrapper(object):
    def __init__(self, ob):
        self.ob = ob

    def __getattr__(self, k):
        logger.debug("action:%s", k)
        return getattr(self.ob, k)

    @property
    def __class__(self):
        return self.ob.__class__


from collections import namedtuple
User = namedtuple("User", "name age")

user = User("foo", 20)
wrapped = LoggedWrapper(user)

logging.basicConfig(level=logging.NOTSET)
print(wrapped.name)
print(wrapped.age)

# DEBUG:__main__:action:name
# foo
# DEBUG:__main__:action:age
# 20

print(isinstance(wrapped, User))
# True

Übrigens, da "class" im Wrapper-Objekt vorhanden ist, wird kein Protokoll ausgegeben.

Recommended Posts

Erstellen Sie eine gefälschte Klasse, die auch betrügt, ist Instanz
Python: Erstellen Sie eine Klasse, die entpackte Zuweisungen unterstützt
Erstellen Sie ein Lebensspiel, das manuell mit tkinter aktualisiert wird
Erstellen Sie eine Instanz einer vordefinierten Klasse aus einer Zeichenfolge in Python
[Hinweis] Bedeutung, dass __unicode__ erforderlich ist, wenn die Modellklasse von Django definiert wird
Erstellen Sie mit Class einen Python-Funktionsdekorator
Klasse, die die API von DMM trifft
Erstellen Sie ein neues Diktat, das Diktate kombiniert
[Python] Erstellen Sie einen LineBot, der regelmäßig ausgeführt wird
Erstellen Sie einen Bot, der Twitter-Trends verstärkt
Ich habe versucht, eine Klasse zu erstellen, mit der Json in Python problemlos serialisiert werden kann
Decorator (@pureinstansemethod), der eine reine Instanzmethode definiert
[Python / Tkinter] Eine Klasse, die einen scrollbaren Frame erstellt
Erstellen Sie eine Seite, die unbegrenzt mit Python geladen wird
[Hinweis] Erstellen Sie mit Python eine einzeilige Zeitzonenklasse
Python: Bereiten Sie einen Serializer für die Klasseninstanz vor: