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